하위 쿼리 기본 사항

하위 쿼리는 SELECT, INSERT, UPDATE, DELETE 문이나 다른 하위 쿼리 내부에 중첩된 쿼리입니다. 하위 쿼리는 식이 허용되는 모든 위치에서 사용할 수 있습니다. 다음 예에서 하위 쿼리는 SELECT 문에서 MaxUnitPrice라는 열 식으로 사용됩니다.

USE AdventureWorks;
GO
SELECT Ord.SalesOrderID, Ord.OrderDate,
    (SELECT MAX(OrdDet.UnitPrice)
     FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet
     WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice
FROM AdventureWorks.Sales.SalesOrderHeader AS Ord

하위 쿼리는 내부 쿼리 또는 내부 선택이라고도 하며 하위 쿼리가 포함된 문을 외부 쿼리 또는 외부 선택이라고 합니다.

하위 쿼리가 포함된 대부분의 Transact-SQL 문은 조인으로 나타낼 수 있습니다. 다른 문제는 하위 쿼리에만 해당됩니다. Transact-SQL에서 하위 쿼리가 포함된 문과 하위 쿼리가 포함되지 않았으나 이와 의미상으로 동일한 문 사이에는 성능상의 차이가 없습니다. 하지만 존재 테스트를 해야 할 경우 조인을 사용하면 성능이 향상될 수 있습니다. 그렇지 않으면 중복 값을 제거하기 위해 각 외부 쿼리 결과에 대해 중첩 쿼리를 처리해야 합니다. 이런 경우 조인을 사용하면 결과를 더 쉽게 얻을 수 있습니다. 다음 예는 동일한 결과 집합을 반환하는 하위 쿼리 SELECT와 조인 SELECT를 보여 줍니다.

/* SELECT statement built using a subquery. */
SELECT Name
FROM AdventureWorks.Production.Product
WHERE ListPrice =
    (SELECT ListPrice
     FROM AdventureWorks.Production.Product
     WHERE Name = 'Chainring Bolts' )

/* SELECT statement built using a join that returns
   the same result set. */
SELECT Prd1. Name
FROM AdventureWorks.Production.Product AS Prd1
     JOIN AdventureWorks.Production.Product AS Prd2
       ON (Prd1.ListPrice = Prd2.ListPrice)
WHERE Prd2. Name = 'Chainring Bolts'

외부 SELECT 문에 중첩된 하위 쿼리는 다음과 같은 구성 요소를 갖습니다.

  • 일반적인 SELECT 목록 구성 요소가 포함된 일반 SELECT 쿼리

  • 하나 이상의 테이블이나 뷰 이름이 포함된 일반 FROM 절

  • 선택적으로 사용되는 WHERE 절

  • 선택적으로 사용되는 GROUP BY 절

  • 선택적으로 사용되는 HAVING 절

하위 쿼리의 SELECT 쿼리는 항상 괄호로 묶습니다. 또한 COMPUTE나 FOR BROWSE 절은 포함할 수 없으며 TOP 절이 지정된 경우 ORDER BY 절만 포함할 수 있습니다.

하위 쿼리는 외부 SELECT, INSERT, UPDATE, DELETE 문의 WHERE 또는 HAVING 절이나 다른 하위 쿼리 내부에 중첩될 수 있습니다. 최대 32개 수준까지 중첩이 가능하지만 이 값은 사용 가능한 메모리 및 쿼리에 있는 다른 식의 복잡성에 따라 달라지며 개별 쿼리에서 32개 수준까지 중첩을 지원하지 않을 수도 있습니다. 하위 쿼리는 단일 값을 반환할 경우 식을 사용할 수 있는 모든 위치에 나타날 수 있습니다.

테이블이 하위 쿼리에만 나타나고 외부 쿼리에는 나타나지 않으면 해당 테이블의 열은 결과(외부 쿼리의 SELECT 목록)에 포함될 수 없습니다.

하위 쿼리가 포함된 문은 다음 중 한 가지 형식을 취합니다.

  • WHERE expression [NOT] IN (subquery)

  • WHERE expression comparison_operator [ANY | ALL] (subquery)

  • WHERE [NOT] EXISTS (subquery)

일부 Transact-SQL 문에서 하위 쿼리는 독립적인 쿼리처럼 평가될 수 있습니다. 개념적으로 하위 쿼리 결과는 외부 쿼리로 대체됩니다. 물론 MicrosoftSQL Server에서 하위 쿼리가 있는 Transact-SQL 문이 반드시 이렇게 처리되는 것은 아닙니다.

하위 쿼리에는 다음과 같은 세 가지 기본 유형이 있습니다.

  • ANY 또는 ALL에 의해 수정된 비교 연산자나 IN으로 시작하는 목록에서 실행

  • 수정되지 않은 비교 연산자로 시작하고 단일 값을 반환

  • EXISTS로 시작하는 존재 테스트