스칼라 또는 다중값 하위 쿼리 사용

완료됨

스칼라 하위 쿼리는 외부 쿼리 내의 내부 SELECT 문이며, 단일 값을 반환하도록 작성됩니다. 스칼라 하위 쿼리는 SELECT 절, WHERE 절, HAVING 절, FROM 절과 같이 단일 값 식이 허용되는 외부 T-SQL 문의 어디에서나 사용할 수 있으며, UPDATE 또는 DELETE와 같은 데이터 수정 문에서도 사용할 수 있습니다.

이름에서 알 수 있듯이 다중값 하위 쿼리는 두 개 이상의 행을 반환할 수 있지만, 단일 열도 반환합니다.

스칼라 하위 쿼리

마지막 주문의 세부 정보를 검색하려고 하며, 해당 주문의 SalesOrderID 값이 가장 크다고 가정합니다.

가장 큰 SalesOrderID 값을 찾으려면 다음 쿼리를 사용하는 것이 좋습니다.

SELECT MAX(SalesOrderID)
FROM Sales.SalesOrderHeader

이 쿼리는 SalesOrderHeader 테이블에서 가장 큰 OrderID 값을 나타내는 단일 값을 반환합니다.

이 주문의 세부 정보를 가져오려면 위의 쿼리에서 반환된 값을 기준으로 SalesOrderDetails 테이블을 필터링해야 할 수 있습니다. 이 작업을 수행하려면 주문 세부 정보를 검색하는 쿼리의 WHERE 절 내에 최대 SalesOrderID를 검색하는 쿼리를 중첩하면 됩니다.

SELECT SalesOrderID, ProductID, OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID = 
   (SELECT MAX(SalesOrderID)
    FROM Sales.SalesOrderHeader);

스칼라 하위 쿼리를 작성하려면 다음 지침을 따르는 것이 좋습니다.

  • 쿼리를 하위 쿼리로 나타내려면 괄호로 묶습니다.
  • Transact-SQL에서는 여러 수준의 하위 쿼리가 지원됩니다. 이 모듈에서는 2개 수준의 쿼리(하나의 외부 쿼리 내에 하나의 내부 쿼리가 있음)만 고려하지만 최대 32개 수준이 지원됩니다.
  • 하위 쿼리에서 반환하는 행이 없으면(빈 집합) 하위 쿼리의 결과는 NULL입니다. 시나리오에서 반환되는 행이 없을 수도 있는 경우 외부 쿼리에서 예상되는 기타 결과 외에도 NULL을 정상적으로 처리할 수 있어야 합니다.
  • 내부 쿼리는 일반적으로 단일 열을 반환해야 합니다. 하위 쿼리에서 여러 열을 선택하면 대부분 오류가 발생합니다. EXISTS 키워드를 사용하여 하위 쿼리를 도입한 경우에만 예외입니다.

스칼라 하위 쿼리는 SELECT 목록을 포함해 값이 필요한 쿼리의 어디에서나 사용할 수 있습니다. 예를 들어 최근 주문의 세부 정보를 검색한 쿼리를 확장하여 주문된 품목의 평균 수량을 포함하는 경우 최근 주문에서 주문된 수량과 모든 주문의 평균을 비교할 수 있습니다.

SELECT SalesOrderID, ProductID, OrderQty,
    (SELECT AVG(OrderQty)
     FROM SalesLT.SalesOrderDetail) AS AvgQty
FROM SalesLT.SalesOrderDetail
WHERE SalesOrderID = 
    (SELECT MAX(SalesOrderID)
     FROM SalesLT.SalesOrderHeader);

다중값 하위 쿼리

다중값 하위 쿼리는 IN 연산자를 사용하여 결과를 반환하는 데 적합합니다. 다음 가상 예제에서는 캐나다의 고객이 요청한 모든 주문의 CustomerID, SalesOrderID 값을 반환합니다.

SELECT CustomerID, SalesOrderID
FROM Sales.SalesOrderHeader
WHERE CustomerID IN (
    SELECT CustomerID
    FROM Sales.Customer
    WHERE CountryRegion = 'Canada');

이 예제에서 내부 쿼리만 실행하는 경우 캐나다에 있는 각 고객의 행이 포함된 CustomerID 값의 열이 반환됩니다.

대부분의 경우 다중값 하위 쿼리는 조인을 사용하여 쉽게 작성할 수 있습니다. 예를 들어 다음은 조인을 사용하여 이전 예제와 동일한 결과를 반환하는 쿼리입니다.

SELECT c.CustomerID, o.SalesOrderID
FROM Sales.Customer AS c
JOIN Sales.SalesOrderHeader AS o
    ON c.CustomerID = o.CustomerID
WHERE c.CountryRegion = 'Canada';

그렇다면 여러 테이블을 포함하는 쿼리를 JOIN으로 작성할지, 하위 쿼리로 작성할지 어떻게 결정합니까? 때로는 좀 더 익숙한 쪽으로 결정할 수도 있습니다. JOIN으로 쉽게 변환되는 대부분의 중첩 쿼리는 실제로 내부에서 JOIN으로 변환됩니다. 이러한 쿼리의 경우 쿼리를 작성하는 두 방법 간에 실질적인 차이가 없습니다.

중첩 쿼리를 사용할 경우에는 클라이언트에 반환되는 결과에 외부 쿼리의 열만 포함될 수 있다는 제한 사항을 유념해야 합니다. 따라서 두 테이블의 열을 반환해야 하는 경우에는 JOIN을 사용하여 쿼리를 작성해야 합니다.

마지막으로, 내부 쿼리에서는 여기 예의 단순한 검색보다 훨씬 복잡한 작업을 수행해야 하는 경우가 있습니다. 복잡한 하위 쿼리는 JOIN을 사용하여 다시 작성하기 어려울 수 있습니다. 많은 SQL 개발자가 복잡한 처리에서 하위 쿼리가 가장 유용하다는 점을 확인하곤 하는데, 처리를 작은 단계로 나눌 수 있기 때문입니다.