1、利用子查询进行过滤
eg:假如需要列出订购物品TNT2的所有客户,具体步骤:
检索包含物品TNT2的所有订单编号
检索具有前一步骤列出的订单编号的所有客户的ID
检索前一步骤返回的所有客户ID的客户信息
上述每个步骤都可以单独作为一个查询来执行,可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE语句。也可以使用子查询把3个查询组合成一条语句。
select order_num FROM orderitems WHERE prod_id=‘TNT2‘;
输出结果为:
order_num:20005,20007
下一步,查询具有订单20005和20007的客户ID。
SELECT cust_id from orders where order_num IN(20005,20007);
输出结果:
cust_id:10001,10004
现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询。请看:
SELECT cust_id from orders where order_num IN(select order_num FROM orderitems WHERE prod_id=‘TNT2‘);
输出结果为:
cust_id:10001,10004
分析:在SELECT语句中,子查询总是从内向外处理。在处理上面的语句时,mysql
实际执行了两个操作。
现在得到了订购物品TNT2的所有客户ID,下一步是检索这些客户ID的客户信息,检索两列的SQL语句为:
SELECT cust_name ,cust_contact from customers where cust_Id in(10001,10004);
上面,可以把其中的where子句转换为子查询而不是硬编码这些客户ID。
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‘));
分析:为了执行上面的select 语句,mysql实际上必须执行3条SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。
不过,在实际使用时由于性能的限制,不能嵌套太多的子查询。
注意:列必须匹配。在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列,通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。
2、作为计算字段使用子查询
使用子查询的另一种方法就是创建计算字段。假如需要显示customers表中每个客户的订单总数,为了执行这个操作,遵循下面的步骤:
从customers表中检索客户列表
对于检索出的每个客户,统计其在orders表中的订单数目。
例如:下面的代码对客户10001的订单进行计数。
SELECT COUNT(*) AS orders FROM orders WHERE cust_id=10001;
为了对每个客户执行COUNT(*)计算,应该将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;
分析:这条SELECT 语句对customers表中的每个客户返回3列: cust_name,cust_state,orders。orders是一个计算字段,它是由圆括号的子查询建立,该子查询对检索出的每个客户执行一次。在此例子汇总,该子查询执行了5次,因此检索出了5个客户。
小结:子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列。