重学MYSQL之子查询

数据库 2020-09-08 764

子查询即嵌套在其他查询中的查询。

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语句中,子查询总是从内向外处理。在处理上面的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条评论