子查询
即嵌套在其他查询中的查询。
利用子查询进行过滤
例:
- 检索包含物品TNT2的所有订单的编号。
- 检索具有前一步骤列出的订单编号的所有客户的ID。
- 检索前一步骤返回的所有客户ID的客户信息。
把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句。
第一步:
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';
第二步:查询具有订单20005和20007的客户ID。
SELECT cust_id
FROM orders
WHERE order_num IN (20005,20007);
现在,把第一个查询变为子查询组合两个查询:
SELECT cust_id
FROM orders
WHERE order_num IN (SELECT
FROM orderitems
WHERE prod_id = 'TNT2');
!:在SELECT语句中,子查询总是从内向外处理。
以上得到了订购物品TNT2的所有客户的ID。下一步是检索这些客户ID的客户信息:
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (10001,10004);
将WHERE子句转换为子查询:
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'));
作为计算字段使用子查询
例:假如需要显示customers表中每个客户的订单总数。订单与相应客户ID存储在orders表中。步骤:
- 从customers表中检索客户列表。
- 对于检索出的每个客户,统计其在orders表中的订单数目。
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.custid) AS orders
FROM cusomers
ORDER BY cust_name;
相关子查询(correlatedsubquery):涉及外部查询的子查询。这种类型的子查询称为相关子查询。任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。