SQL 子查询

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

什么是子查询?

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

子查询提供了一种简单有效的方法来处理依赖于另一个查询结果的查询。它们几乎与正常 SELECT 陈述相同,但几乎没有限制。最重要的列表如下:

  • 子查询必须始终出现在括号内。
  • 子查询必须只返回一列。这意味着你不能在子查询中使用 SELECT *,除非你引用的表只有一列。如果目的是行比较,则可以使用返回多个列的子查询。
  • 你只能使用返回多行的子查询和多个值运算符,例如 INNOT IN 运算符。
  • 子查询不能是一个 UNION。只有一个 SELECT 语句是允许的。

子查询跟 SELECT 语句最频繁使用的语句,但是你可以在 INSERTUPDATEDELETE 内部使用它们,或者其它子查询中使用。

带有 SELECT 语句的子查询

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

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

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

注: 子查询可以嵌套在外层的 SELECTINSERTUPDATE 或者 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 美元的客户。

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

带有 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 美元来更新 orders 表中的 order 数值。

带有 DELETE 语句的子查询

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

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

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