《SQL必知必会》读书笔记
子查询:即嵌套在其他查询中的查询。
1.利用子查询进行过滤
现在,假如需要列出订购物品RGAN01的所有顾客,应该怎样检索?下面列出具体的步骤。
(1)检索包含物品RGAN01的所有订单的编号。
(2)检索具有前一步骤列出的订单编号对应的所有顾客的ID。
(3)检索前一步骤返回的所有顾客ID的顾客信息。
分步检索:
--1.检索物品RGAN01对应的订单的编号
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'
order_num
20007
20008
--2.检索上一步订单编号对应的所有顾客的ID
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008)
cust_id
10000000004
10000000005
--3.检索上一步顾客的ID对应的顾客信息
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN ('1000000004','1000000005')
cust_name cust_contact
Fun4All Deise L. Stephens
The Toy Store Kim Howard
整体检索(利用子查询):
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN(
SELECT cust_id
FROM Order
WHERE order_num IN(
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'
)
)
注:在SELECT语句中,子查询总是从内向外处理。
注意:只能是单列
作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。
注意:子查询和性能
这里给出的代码有效,并且获得了所需的结果。但是,使用子查询并不总是执行这类数据检索的最有效方法。
2.作为计算字段使用子查询
使用子查询的另一方法是创建计算字段。
SELECT cust_name, cust_state,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name
orders是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个顾客执行一次。在此例中,该子查询执行了5次,因此检索出5个顾客。
3.总结
子查询常用于WHERE子句的IN操作符中,以及用来填充计算列。