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后算法工程师