列出够物品RGAN01的所有客户。

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

    解释: 列出所有RGAN01订单物品

    1. -> FROM Orders
    2. -> WHERE order_num IN (20007, 20008);
    3. +------------+
    4. | cust_id |
    5. +------------+
    6. | 1000000004 |
    7. | 1000000005 |
    8. +------------+
    9. 2 rows in set (0.00 sec)
    • 子查询是从内向外处理
    • 先执行 SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01'
    • 把返回的订单号,20007,20008两个值以IN操作符用逗号格式传递给外部查询,
    1. mysql> SELECT cust_name, cust_contact
    2. -> FROM Customers
    3. -> WHERE cust_id IN (SELECT cust_id
    4. -> FROM Orders
    5. -> WHERE order_num IN (SELECT order_num
    6. -> WHERE prod_id = 'RGAN01'));
    7. +---------------+--------------------+
    8. | cust_name | cust_contact |
    9. +---------------+--------------------+
    10. | Fun4All | Denise L. Stephens |
    11. | The Toy Store | Kim Howard |
    12. +---------------+--------------------+
    13. 2 rows in set (0.01 sec)
    • 解释:
      • SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01' 查询返回订单列表
      • 把上面的查询结果,给予 SELECT cust_id FROM Orders, 返回客户ID
      • 拿到返回的客户ID给予外层WHERE子句查询。
        注意: 子查询只能返回单个列。

    作为计算字段使用子查询

    例子:计算Customers中每个客户订单总数。

    • 对检索出来的每个客户,统计其在Orders表中的订单数目。
      单个客户查询

    对每个客户执行COUNT(*)

    1. mysql> SELECT cust_name,
    2. -> cust_state,
    3. -> (SELECT COUNT(*)
    4. -> FROM Orders
    5. -> WHERE Orders.cust_id = Customers.cust_id) AS
    6. -> orders
    7. -> ORDER BY cust_name;
    8. +---------------+------------+--------+
    9. | cust_name | cust_state | orders |
    10. +---------------+------------+--------+
    11. | Fun4All | IN | 1 |
    12. | Fun4All | AZ | 1 |
    13. | Kids Place | OH | 0 |
    14. | The Toy Store | IL | 1 |
    15. | Village Toys | MI | 2 |
    16. +---------------+------------+--------+

    Orders.cust_id = Customers.cust_id , 其中的句号,表示指定限定表名跟列,如果不具体指定表名,列名,将返回Orders 表中的订单总数。如下: