使用子查询

子查询

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

利用子查询进行过滤

列出订购物品TNT2的所有客户,该如何检索?
- 检索包含物品TNT2的所有订单的编号
- 检索具有前一步骤列出的订单编号的所有客户的ID
- 检索迁移步骤返回的所有客户ID的客户信息
可把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句

- 列出两个包含此物品的订单
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';
- 查询具有订单20005和20007的客户ID
SELECT cust_id
FROM orders
WHERE order_num IN (20005, 20007)

将上述两个查询进行综合
SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
									 FROM orderitems
									 WHERE prod_id = 'TNT2');

- 检索这些客户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'));

子查询一般与IN操作符结合使用,
但也可用于测试等于,不等于等

作为计算字段使用子查询

显示customer表中每个客户的订单总数
- 从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列
orders是一个计算字段,
是由圆括号中的子查询建立的,
该子查询对检索出的每个客户执行一次
子查询中的WHERE子句使用了完全限定名

这种类型的子查询称为相关子查询[涉及外部查询的子查询]
任何时候只要列名可能有多义性,就需用完全限定方式


采用子查询时,要在测试正确基础上,逐层构建,来保证结果稳定

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/108984068