1.利用子查询进行过滤
现在,假如需要列出订购物品 RGAN01 的所有顾客,应该怎样检索?
下面列出具体的步骤
①检索包含物品RGAN01的所有订单的编号
②检索具有前一步骤列出的订单编号的所有顾客的ID
上述每个步骤都可以单独作为查询来执行。
可以把一条SELECT 语句返回的结果用于另一条SELECT语句的WHERE子句。
也可以使用子查询来把2个查询组合成一条语句
第一条SELEC语句的含义很明确,它对prod_id 为RGAN01的所有订单物品,检索其order_num列。输出列出了两个包含此物品的订单:
SQL
SELECT order_num
FROM OrdersItems
WHERE prod_id = 'RGAN01'
"SELECT ID
FROM blockbusters
WHERE `主流派` = 'Music'"
现在,我们知道了哪个订单包含要检索的物品,下一步查询与订单20007和20008相关的顾客ID。利用第5课介绍的IN子句,编写如下的SELECT语句:
SQL
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008)
"SELECT `票房`
FROM blockbusters
WHERE ID IN(10,12,220,262)"
现在结合这两个查询,把第一个查询(返回订单号的那一个)变为子查询。
SQL
SELECT cust_id
FROM Orders
WHERE order_num IN(SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01')
"SELECT `票房`
FROM blockbusters
WHERE ID IN(SELECT ID
FROM blockbusters
WHERE `主流派` = 'Music')"
在SELECT语句中,子查询总是从内向外处理。
PowerShell
注意:只能是单列
作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。
注意:子查询和性能
这里给出的代码有效,并且获得了所需的结果。但是,使用子查询并不总是执行这类数据检索的最有效方法。
2.作为计算字段使用子查询
使用子查询的另一方法是创建计算字段。
假如需要显示Customers表中每个顾客的订单总数。
订单与相应的顾客ID存储在Orders表中。
执行这个操作,要遵循下面的步骤:
①从Customers 表中检索顾客列表;
②对于检索出每个顾客,统计其在Orders表中的订单数目。
SQL
SELECT COUNT(*) AS orders
FROM Ordes
WHERE cust_id = 10000001;
SQL
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;