TOP

SQL 레슨 9. 하위 쿼리

YouLibreCalc for Excel logo

지금까지 우리는 간단한 쿼리와 단일 SELECT 문을 사용하여 데이터베이스에서 데이터를 가져왔습니다. 그러나 여전히 많은 조건을 충족하는 데이터를 선택해야 하는 경우가 더 자주 발생하며 여기서는 고급 쿼리 없이는 할 수 없습니다. 이를 위해 SQL에는 하나의 SELECT 문이 다른 문 안에 중첩되는 하위 쿼리 또는 중첩 쿼리가 있습니다.

하위 쿼리는 다른 SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE 또는 다른 하위 쿼리 내에 중첩된 SELECT 문입니다.

하위 쿼리 텍스트는 괄호로 묶어야 합니다. 테이블 조인(JOIN) 대신 하위 쿼리를 사용하는 경우가 많습니다.


1. 서브쿼리를 이용한 필터링

DBMS Access에서 사용하는 데이터베이스 테이블은 관계형 테이블이다. 즉, 모든 테이블은 공통 필드를 통해 서로 연결될 수 있다. 두 개의 서로 다른 테이블에 데이터를 저장하고 다른 테이블에 어떤 데이터가 있는지에 따라 그 중 하나에서 데이터를 선택해야 한다고 가정합니다. 이를 위해 데이터베이스에 다른 테이블을 만듭니다. 예를 들어 공급업체에 대한 정보가 포함된 Sellers 테이블은 다음과 같습니다.

이제 동일한 City 필드를 갖는 Sumproduct 및 Sellers라는 두 개의 테이블이 있습니다. 캐나다에서만 몇 개의 제품이 판매되었는지 계산해야 한다고 가정해 보겠습니다. 하위 쿼리는 이를 수행하는 데 도움이 됩니다. 먼저 캐나다에 위치한 도시 샘플에 대한 쿼리를 작성해 보겠습니다.

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

이제 이 데이터를 다음 쿼리에 전달하면 Sumproduct 테이블에서 데이터가 선택됩니다.

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

이 두 요청을 하나로 결합할 수도 있습니다. 따라서 데이터를 출력하는 하나의 요청이 기본 요청이 되고, 입력 데이터를 전송하는 두 번째 요청이 보조(하위 쿼리)가 됩니다. 하위 쿼리를 삽입하려면 고급 필터링 섹션에서 설명한 WHERE ... IN (...) 구성을 사용합니다.

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

두 개의 개별 쿼리를 사용하여 동일한 데이터를 얻은 것을 볼 수 있습니다. 같은 방식으로 하위 쿼리를 원하는 만큼 중첩하여 쿼리의 중첩 깊이를 늘릴 수 있습니다.

2. 정산 필드로 하위 쿼리 사용

하위 쿼리를 계산된 필드로 사용할 수도 있습니다. 예를 들어 다음 쿼리를 사용하여 각 판매자의 판매된 제품 수를 표시해 보겠습니다.

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

첫 번째 문 SELECT은 Seller_name 및 Qty이라는 두 개의 열을 표시합니다. Qty 필드가 계산되며, 이는 대괄호로 묶인 하위 쿼리 실행의 결과로 형성됩니다. 이 서브 쿼리는 Seller_name 필드의 레코드당 1회씩 실행되며, 판매자 이름이 4개 선택되었으므로 총 4회 실행됩니다.

또한 하위 쿼리에서 WHERE 절은 조인 기능을 수행합니다. WHERE의 도움으로 열의 전체 이름(Table.Field)을 사용하여 City 필드로 두 테이블을 조인했기 때문입니다.