English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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
DELETE FROM orders WHERE order_id IN (SELECT order_id FROM order_details WHERE product_id = 5);

위 예제의 SQL 문장은 다음과 같은 데이터를 포함한 테이블에서 선택됩니다:product_id위치5제품 주문 테이블에서 이 주문을 제거합니다。