子查询即嵌套在其他查询中的查询。
1.利用子查询进行过滤
我希望查询出商品表中的商品类型占商品类型表中的多少种,并返回商品类型名称(该字段在商品类型表种)。
-- 查询出商品表中的商品的category_id
SELECT category_id FROM goods_goods;
-- 查询出商品类型表中的商品类型名称
SELECT name FROM goods_goodscategory;
-- 合并这两个子查询
SELECT name FROM goods_goodscategory WHERE id IN
(SELECT category_id FROM goods_goods);
(SELECT category_id FROM goods_goods);
在SELECT语句中,子查询总是从内向外处理。在处理上面的SELECT语句时,实际执行了2个操作。
首先,它执行了SELECT category_id FROM goods_goods,之后,查询到的值以IN操作符要求的逗号分隔的格式传递给外部查询的WHERE子句,外部查询变为了
SELECT name FROM goods_goodscategory WHERE id IN (2, 2, 7, 7,50....)
子查询还可以继续嵌套,但是不宜嵌套过多,影响性能。由于表设计的缘故,无法演示第2层嵌套。
注意:作为子查询的SELECT语句,只能查询单列。企图查询多个列会发生错误。
2.作为计算字段使用子查询
假如需要显示Customers表每个顾客的订单总数。订单与相应的顾客ID存储在Orders表中。
执行这个操作需要遵循以下步骤;
(1)从Customers表检索顾客列表
(2)对于检索出的每个顾客,统计其在Orders表中的订单数。
可以使用SELECT COUNT(*) 对表中的行进行计数且通过提供一条WHERE子句来过滤某个特定的顾客ID,仅对该顾客的订单进行计数。如下,对顾客10086的订单进行计数
SELECT COUNT(*) AS orders FROM Orders WHERE cust_id = '10086';
要对每个顾客执行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
该条语句返回Customers中每个顾客返回三列: cust_name cust_state,orders。orders为1个计算字段。WHERE子句稍有不同,因为它使用了完全限定列名(Orders.cust_id).
评论列表
已有0条评论