SQL 子查询
在本教程中,您将学习如何在 SQL 中的另一个查询中嵌入一个查询。
什么是子查询?
子查询,也称为嵌套查询或子选择,是嵌入在另一个 SQL 查询的 WHERE
或 HAVING
子句中的 SELECT
查询。 子查询返回的数据被外部语句以与使用文字值相同的方式使用。
子查询提供了一种简单有效的方式来处理依赖于另一个查询结果的查询。 它们几乎与普通的 SELECT
语句相同,但几乎没有限制。 下面列出了最重要的一些:
- 子查询必须始终出现在括号内。
- 子查询必须只返回一列。 这意味着您不能在子查询中使用
SELECT *
,除非您引用的表只有一列。 如果目的是行比较,您可以使用返回多列的子查询。 - 您只能使用通过多个值运算符(例如
IN
或NOT IN
运算符)返回多于一行的子查询。 - 子查询不能是
UNION
。 只允许使用单个SELECT
语句。
子查询最常与 SELECT
语句一起使用,但是您也可以在 INSERT
, UPDATE
, 或 DELETE
语句中或在另一个子查询中使用它们。
带有 SELECT 语句的子查询
以下语句将仅返回 orders 表中订单价值超过 5000 美元的客户的详细信息。 另请注意,我们在子查询中使用了关键字 DISTINCT
以从结果集中消除重复的 cust_id 值。
SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders
WHERE order_value > 5000);
提示:子查询可以返回单个值、单个行、单个列或包含一行或多行一列或多列的表。
带有 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 美元,为居住在邮政编码为 75016 地区的客户更新 orders 表中的订单价值。
带有 DELETE 语句的子查询
同样,您可以将子查询与 DELETE
语句结合使用来删除表中的单行或多行,如下所示:
DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_details
WHERE product_id = 5);
上例中的 SQL 语句将从包含 product_id 为 5 的产品的 orders 表中删除这些订单。