使用子查询

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;
订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
滚动至顶部