MySQL必知必会 —— 第十四章 使用子查询

1. 子查询

查询(query) 任何SQL语句都是查询。但此术语一般指SELECT语句。
子查询(subquery) 即嵌套在其他查询中的查询

2. 利用子查询进行过滤

select order_num from orderitems
where prod_id = 'TNT2';

MySQL必知必会 —— 第十四章 使用子查询_第1张图片

select cust_id from orders
where order_num in (20005,20007);

MySQL必知必会 —— 第十四章 使用子查询_第2张图片
利用子查询将两个上述两个查询合并

select cust_id from orders
where order_num in(select order_num from orderitems
	where prod_id = 'TNT2');

MySQL必知必会 —— 第十四章 使用子查询_第3张图片
格式化SQL 包含子查询的SELECT语句难以阅读和调试,特别是它们较为复杂时更是如此。如上所示把子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用。

列必须匹配 在WHERE子句中使用子查询(如这里所示),应该保证SELECT语句具有与WHERE子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。

子查询和性能 这里给出的代码有效并获得所需的结果。但是,使用子查询并不总是执行这种类型的数据检索的最有效的方法。更多的论述,请参阅第15章,其中将再次给出这个例子。

3.作为计算字段使用子查询

使用子查询的另一方法是创建计算字段。假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。为了执行这个操作,遵循下面的步骤。
(1) 从customers表中检索客户列表。
(2) 对于检索出的每个客户,统计其在orders表中的订单数目。
可使用SELECT COUNT(*)对表中的行进行计数,并且通过提供一条WHERE子句来过滤某个特定的客户ID,可仅对该客户的订单进行计数。例如,下面的代码对客户10001的订单进行计数:

select count(*) as orders from orders
where cust_id = 10001;

为了对每个客户执行COUNT()计算,应该将COUNT()作为一个子查询。请看下面的代码:

select cust_name,cust_state,
	(select count(*) from orders
	where order.cust_id = customers.cust_id) as orders
from customers
order by cust_name;

MySQL必知必会 —— 第十四章 使用子查询_第4张图片

你可能感兴趣的:(MySQL必知必会,笔记)