之前的学习的所有SELECT语句都是简单查询,只从单个数据库表中检索数据的单条语句,SQL还允许建立子查询:嵌套在其他查询中的查询
-
举例:表orderitems只存储客户的ID和物品信息。实际的客户信息存储在customers表中
现在需要查询订购物品TNT2的所有客户
1、在orderitems表中检索出含物品TNT2的所有订单的编号
2、检索具有步骤1的订单编号的所有客户的ID
3、检索步骤2返回的所有客户ID的客户信息
1、对prod_id为TNT2的所有订单,检索其order_num列,得出相应的订单号为200005和200007
SELECT order_num FROM orderitems WHERE prod_id = 'TNT2';
2、查询具有订单200005和200007两个订单的ID为10001和10004
SELECT cust_id FROM orders WHERE order_num IN (200005,200007);
3、检索这些ID的客户信息
SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (10001,10004);
把第一个查询变成子查询,组合以上两个查询,在SELECT语句中,子查询从内向外处理
SELECT cust_id FROM orders WHERE order_num IN
(SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');
把以上组合变为子查询,和第三次进行组合
SELECT cust_name,cust_contact FROM customers WHERE
(SELECT cust_id FROM orders WHERE order_num IN
(SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));
- 使用相关子查询时注意使用完全限定名,在不同表中区分
例:显示costomers表中每个客户的订单总数,订单和相应的客户ID存储在orders表中
1、从customers表中检索客户列表
2、对检索出的每个用户,使用COUNT()统计在orders表中的订单数目
SELECT cust_name,cust_status,(SELECT COUNT(*) FROM orders WHERE orders.id = customers.id) AS orders
FROM customers ORDER BY cust_name;