0%

《MySQL必知必会》读书笔记 第十四章 使用子查询

子查询

MySQL 4.1引入了对子查询的支持。子查询(subquery)是嵌套在其他查询中的查询。

利用子查询进行过滤

列出订购物品TNT2的所有客户,步骤如下

  1. 检索包含物品TNT2的所有订单的编号。
  2. 检索具有前一步骤列出的订单编号的所有客户的ID。
  3. 检索前一步骤返回的所有客户ID的客户信息。

可以把以上每个步骤单独查询,上一条语句返回的记过用于下一条语句的筛选条件

1
2
3
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';
1
2
3
SELECT cust_id
FROM orders
WHERE order_num IN (20005, 20007);
1
2
3
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (10001, 10004);

用子查询组合以上SQL

1
2
3
4
5
6
7
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 = 'TNT2'));

在WHERE子句中使用子查询(如这里所示),应该保证SELECT语句具有与WHERE子句中相同数目的列。通常,
子查询将返回单个列并且与单个列匹配。

作为计算字段使用子查询

显示customers表中每个客户的订单总数,步骤如下:

  1. 从customers表中检索客户列表。
  2. 对于检索出的每个客户,统计其在orders表中的订单数目。
1
2
3
4
5
6
7
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;