SQL:子查询

1 利用子查询进行过滤

假如需要列出订购物品 RGAN01 的所有顾客,应该怎样检索?

那么检索的步骤如下:

检索包含物品 RGAN01 的所有订单的编号。

检索具有前一步骤列出的订单编号的所有顾客的ID。

检索前一步骤返回的所有顾客ID的顾客信息。

也就是说:

/* 1 列出包含 RGAN01 物品的订单*/

SELECT order_num

FROM OrderItems

WHERE prod_id = 'RGAN01';

/* 假设输出:

order_num

-----------

207

208

*/

/* 2 查询与订单207和208相关的顾客ID。*/

SELECT cust_id

FROM Orders

WHERE order_num IN (207, 208)

/* 假设输出:

cust_id

----------

1000004

1000005

*/

/* 3 根据顾客ID查询相关信息*/

SELECT cust_name, cust_contact

FROM Customers

WHERE cust_id IN ('1000004','1000005');


⚠️ 在SELECT语句中,子查询总是从内向外处理。在处理上面的SELECT语 句时,DBMS实际上执行了两个操作。

⚠️ 作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。

2 作为计算字段使用子查询

假如需要显示 Customers 表中每个顾客的订单总数。订单与相应的顾客 ID 存储在 Orders 表中。

那么检索的步骤如下:

从 Customers 表中检索顾客列表;

对于检索出的每个顾客,统计其在 Orders 表中的订单数目。

/*

对顾客1000001的订单进行计数:

SELECT COUNT(*) AS orders

FROM Orders

WHERE cust_id = '1000001';

因此,如果要对每个顾客执行COUNT(*),应该将它作为一个子查询。

*/

SELECT cust_name,

      cust_state,

      (SELECT COUNT(*)

      FROM Orders

      WHERE Orders.cust_id = Customers.cust_id) AS orders

FROM Customers

ORDER BY cust_name;

完全限定列名(Fully Qualified Column Name):在 SQL 查询中明确指出列所属的表名,这样可以避免由于列名在多个表中重复而导致的歧义,格式通常是 表名.列名。


我是文熠,一个正在找工作的95后算法工程师

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容