文章目录
  1. 子查询
  2. 联结表
  3. 创建高级联结
  4. 组合查询

子查询

SQL允许创建子查询,即嵌套在其他查询中的查询;

如列出订购物品RGAN01的所有客户,由物品RGAN01检索出所有的订单编号,再根据订单编号检索出客户ID,再根据客户ID获得客户信息。

使用子查询来获取

1
2
3
4
5
6
SELECT cust_name, cust_contact FROM Customers
where cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id='RGAN01'));

作为计算字段使用子查询,如列出Customers表中每个客户的订单总数;

1
2
3
4
SELECT cust_name, cust_state,
(SELECT COUNT(*) FROM Orders
WHERE Orders.cust_id=Customers.cust_id) AS orders
FROM Customers ORDER BY cust_name;

联结表

分解数据为多个表能更有效地存储,更方便地处理,并具有更大的可伸缩性。

此时数据存储在多个表,如何用单条SELECT语句检索出数据——联结。

联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。

1
2
3
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id=Products.vend_id;

上述联结称为等值联结,它基于两个表之间的相等测试;这种联结也称为内部联结。

另一种指定联结的方式如下。

1
2
3
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id=Products.vend_id;

SQL不限制SELECT语句中可以联结的列的数目,创建联结的基本规则也相同——列出所有表,再定义表之间的关系。

1
2
3
4
5
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id=Vendors.vend_id
AND OrderItems.prod_id=Products.prod_id
AND order_num=20007;

另一种语法表示为

1
2
3
4
5
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems INNER JOIN Products INNER JOIN Vendors
ON Products.vend_id=Vendors.vend_id
AND OrderItems.prod_id=Products.prod_id
AND order_num=20007;

创建高级联结

外部联结:为包含那些不符合关系的行,就需要外部联结。外部联结使用OUTER JOIN指定联结的类型,LEFT指定要包含所有行的表是OUTER JOIN左边的表——Customers。

1
2
3
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id=Orders.cust_id;

在联结时也可以使用聚集函数。

1
2
3
4
SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
ON Customers.cust_id=Orders.cust_id
GROUP BY Customers.cust_id;

组合查询

SQL支持执行多个查询并将结果以单个查询结果返回,这就是组合查询。实际就是对这些查询结果取并操作。

创建组合查询,使用UNION关键字将多个SELECT语句连接。

如查询位于Illinois、Indiana与Michigan以及Fun4All单位的客户。

1
2
SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL', 'IN', 'MI') UNION
SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name='Fun4All';

在WHERE语句过于复杂时,使用UNION语句将会是更好的办法。

使用UNION语句需要注意如下几条规则。

 

UNION语句默认会将重复的行合并,若不想其合并,可使用UNION ALL关键字;

若要对组合查询的结果排序,只能在最后一条SELECT语句之后使用ORDER BY语句。