chapter14:使用子查询

子查询

即嵌套在其他查询中的查询。

利用子查询进行过滤

例:

  1. 检索包含物品TNT2的所有订单的编号。
  2. 检索具有前一步骤列出的订单编号的所有客户的ID。
  3. 检索前一步骤返回的所有客户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表中。步骤:

  1. 从customers表中检索客户列表。
  2. 对于检索出的每个客户,统计其在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):涉及外部查询的子查询。这种类型的子查询称为相关子查询。任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。

你可能感兴趣的:(chapter14:使用子查询)