SQL 子查询

在本教程中,您将学习如何在SQL中将查询嵌入另一个查询中。

什么是子查询?

子查询,也称为嵌套查询或子选择,是SELECT嵌入在另一个SQL查询的 WHEREHAVING子句中的查询。子查询返回的数据由外部语句使用,与使用文字值的方式相同。

子查询提供了一种简单而有效的方法来处理依赖于另一个查询结果的查询。它们几乎与普通的SELECT语句相同,但几乎没有限制。最重要的几点如下:

  • 子查询必须始终出现在括号内。

  • 子查询必须只返回一列。这意味着不能在子查询中使用SELECT *,除非所引用的表只有一列。如果目的是行比较,可以使用返回多列的子查询。

  • 您只能使用返回多个值运算符(例如INNOT IN运算符)的多行的子查询。

  • 子查询不能是UNION。只允许一个SELECT语句。

子查询最常与SELECT语句一起使用,但是也可以在INSERTUPDATEDELETE语句中或在另一个子查询中使用它们。

带有SELECT语句的子查询

以下语句仅返回订单表中订单价值超过5000美元的那些客户的详细信息。 还要注意,我们在子查询中使用了关键字DISTINCT从结果集中消除了重复的cust_id值。

SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);

提示:子查询可以返回单个值,单个行,单个列或包含一个或多个行或一个或多个列的表。

注意:子查询可以嵌套在外部SELECTINSERTUPDATEDELETE语句的WHEREHAVING子句中,也可以嵌套在其他子查询中。

带有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美元的客户。

提示:查阅有关SQL克隆表的教程,以了解如何使用INSERT?...?SELECT 语句快速将多行从另一个表插入到表中。

带有UPDATE语句的子查询

您还可以将子查询与UPDATE语句结合使用,以更新表中的单列或多列,如下所示:

UPDATE orders
SET order_value = order_value + 10
WHERE cust_id IN (SELECT cust_id FROM customers WHERE postal_code = 75016);

通过将当前订单值增加10美元,上述语句将更新订单(orders)表中邮政编码为75016的地区的客户的订单值。

带有DELETE语句的子查询

同样,可以将子查询与DELETE语句结合使用,以删除表中的单行或多行,如下所示:

DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_details WHERE product_id = 5);

上面示例中的SQL语句将从包含product_id为5的产品的订单表中删除这些订单。