14.1子查询
子查询:嵌套在其他查询中的查询。
14.2利用子查询进行过滤
输入
SELECT cust_name,cust_contact FROM customers
WHERE cust_id IN(SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2'
)
);
输出
+----------------+--------------+
| cust_name | cust_contact |
+----------------+--------------+
| Coyote Inc. | Y Lee |
| Yosemite Place | Y Sam |
+----------------+--------------+
分析
为了执行上述SELECT语句;MySQL实际上必须执行3条SELECT语句,最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层的WHERE子句,最外层的查询确实返回所需的数据。
在 SELECT语句中,子查询总是从内向外处理。
通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。
子查询往往性能不佳
14.3作为计算字段使用子查询
例:
假如需要显示customers 表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。
SELECT cust_ name ,
cust_ state ,
(SELECT COUNT(*)
FROM- orders
WHERE orders.cust_ id = customers.cust_ id) AS orders
FROM cus tomers
ORDER BY cust_ name;
如上图那样,涉及外部查询的子查询,我们称之为相关子查询。
建议:逐渐增加子查询来建立查询,可以有效地测试和调试查询。
14.4小结
本章学习了什么是子查询以及如何使用它们。子查询最常见的使用 是在WHERE子句的IN操作符中,以及用来填充计算列。我们举了这两种操 作类型的例子。