- 参考资料
- 《MySQL必知必会(文字版)》
1、子查询
1.1 介绍
- 子查询:嵌套在其他查询中的查询
1.2 利用子查询进行过滤
- 订单存储在两个表中。
- 每个订单包含订单编号、客户
ID
、订单日期,在Orders
表中存储为一行。【Orders 表不存储顾客信息,只存储顾客 ID。】- 各订单的物品存储在相关的
OrderItems
表中。- 顾客的实际信息存储在
Customers
表中。
- 假如需要列出订购物品
RGAN01
的所有顾客,检索步骤如下:
- 步骤1:检索包含物品
RGAN01
的所有订单的编号。
- 即:对
prod_id
为RGAN01
的所有订单物品,检索其order_num
列
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01';
- 步骤2:检索具有前一步骤列出的订单编号的所有顾客的
ID
。
- 即:步查询与订单 20007 和 20008 相关的顾客
ID
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008);
- 步骤3:检索前一步骤返回的所有顾客
ID
的顾客信息。
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN ('1000000004','1000000005');
- 完整的子查询:
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'));
- 作为子查询的
SELECT
语句只能查询单个列。企图检索多个列将返回错误。
1.3 作为计算字段使用子查询
- 需要显示
Customers
表中每个顾客的订单总数。【订单与相应的顾客ID
存储在Orders
表中。】
- 步骤1: 从
Customers
表中检索顾客列表;- 步骤2:对于检索出的每个顾客,统计其在 Orders 表中的订单数目。
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
- orders 是一个计算字段,它是由圆括号中的 子查询建立的。该子查询对检索出的每个顾客执行一次。在此例中,该 子查询执行了 5 次,因为检索出了 5 个顾客。
- 子查询中的
WHERE
子句与前面使用的WHERE
子句稍有不同,因为它使用了 完全限定列名,而不只是列名(cust_id
)。- 它指定表名和列名(
Orders.cust_id
和Customers.cust_id
)。 【比较Orders
表中的cust_id
和当前正从Customers
表中检索的cust_id
:WHERE Orders.cust_id = Customers.cust_id
用一个句点分隔表名和列名,在有可能混淆列名时必须使用这种语法。】