你的浏览器不支持canvas

Enjoy life!

数据库-SQL(六)子查询

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

  • 参考资料
    • 《MySQL必知必会(文字版)》

1、子查询

1.1 介绍

  • 子查询:嵌套在其他查询中的查询

1.2 利用子查询进行过滤

select

  • 订单存储在两个表中。
    • 每个订单包含订单编号、客户 ID、订单日期,在 Orders 表中存储为一行。【Orders 表不存储顾客信息,只存储顾客 ID。】
    • 各订单的物品存储在相关的 OrderItems 表中。
  • 顾客的实际信息存储在 Customers 表中。

  • 假如需要列出订购物品 RGAN01 的所有顾客,检索步骤如下:
  • 步骤1:检索包含物品 RGAN01 的所有订单的编号。
    • 即:对 prod_idRGAN01 的所有订单物品,检索其 order_num
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'; 

select

  • 步骤2:检索具有前一步骤列出的订单编号的所有顾客的 ID
    • 即:步查询与订单 20007 和 20008 相关的顾客 ID
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008); 

select

  • 步骤3:检索前一步骤返回的所有顾客 ID 的顾客信息。
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN ('1000000004','1000000005'); 

select


  • 完整的子查询:
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;

select

  • orders 是一个计算字段,它是由圆括号中的 子查询建立的。该子查询对检索出的每个顾客执行一次。在此例中,该 子查询执行了 5 次,因为检索出了 5 个顾客。
  • 子查询中的 WHERE 子句与前面使用的 WHERE 子句稍有不同,因为它使用了 完全限定列名,而不只是列名(cust_id )。
  • 它指定表名和列名(Orders.cust_idCustomers.cust_id)。 【比较Orders表中的 cust_id 和当前正从 Customers 表中检索的 cust_idWHERE Orders.cust_id = Customers.cust_id 用一个句点分隔表名和列名,在有可能混淆列名时必须使用这种语法。

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。