本章将学习如何将查询嵌入到另一个查询中。
什么是子查询?
子查询,也称为嵌套查询或子选取,是嵌入在另一个查询的WHERE
或HAVING
子句中的SELECT
查询。子查询返回的数据,由外部语句使用时,使用方式与普通值相同。
子查询提供了一种简单而有效的方法,从一个查询结果集中再进行查询。子查询与普通查询基本相同,有一些要注意的地方:
- 子查询必须始终出现在括号内。
- 子查询通常只返回一个字段。这意味着不能在子查询中使用
SELECT *
,除非表只有一列。如果目的是行比较,子查询可以返回多个字段。 - 使用像
IN
、NOT IN
这样的多值操作符时,子查询必须返回多行。 - 子查询中不能使用
UNION
,只允许有一个SELECT
语句。
子查询最常与SELECT
语句一起使用,但是也可以在INSERT
、UPDATE
或DELETE
语句中使用。
SELECT语句使用子查询
下面的语句,要从订单表中,返回订单值超过5000美元的客户详细信息。子查询中使用了DISTINCT
关键字,消除查询结果中重复的cust_id
值。
SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders
WHERE order_value > 5000);
外部SELECT
、INSERT
、UPDATE
、DELETE
语句的WHERE
或HAVING
子句中可以嵌入子查询,一个子查询中也可以嵌入子查询。
INSERT语句使用子查询
子查询也可以与INSERT
语句一起使用。请看例子:
INSERT INTO premium_customers
SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders
WHERE order_value > 5000);
上面的语句使用子查询返回的数据,将高级客户的记录插入到premium_customers表中。这里的高级客户是订购价值超过5000美元的客户。
INSERT ... SELECT
语句可参考SQL 复制表
UPDATE语句使用子查询
子查询可以与UPDATE
语句一起使用,如下所示:
UPDATE orders
SET order_value = order_value + 10
WHERE cust_id IN (SELECT cust_id FROM customers
WHERE postal_code = 75016);
上述语句,对于邮政编码为75016的客户,将他们的订单值增加10美元。
DELETE语句中使用子查询
同样,可以在DELETE
语句中使用子查询,如下:
DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_details
WHERE product_id = 5);
上面语句,对于product_id为5的产品订单,将其从orders表中删除。