SQL Server 서브쿼리(Subquery) 완벽 가이드
이 글에서는 SQL Server에서 서브쿼리를 사용하는 방법을 문법과 실제 예제와 함께 자세히 살펴봅니다.
SQL에서 서브쿼리란 무엇인가?
SQL Server에서 서브쿼리(subquery)란 다른 쿼리 내부에 포함된 쿼리를 의미합니다. 하나의 SQL 명령문 안에 또 다른 쿼리를 작성할 수 있으며, 이러한 서브쿼리는 WHERE, FROM 또는 SELECT 절에 위치할 수 있습니다.
참고 사항:
- 서브쿼리는 INNER QUERY(내부 쿼리) 또는 INNER SELECT라고도 불립니다.
- 서브쿼리를 포함하는 메인 쿼리는 OUTER QUERY(외부 쿼리) 또는 OUTER SELECT라고 합니다.
WHERE 절에서의 서브쿼리
일반적으로 서브쿼리는 WHERE 절에 위치하며, 이런 형태의 서브쿼리를 중첩 쿼리(nested query)라고 부르기도 합니다.
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
WHERE s.sanpham_id IN
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong > 10);
위 SELECT 문에서 서브쿼리에 해당하는 부분은 다음과 같습니다.
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong > 10);
이 서브쿼리는 hangtonkho 테이블에서 수량(soluong)이 10보다 큰 sanpham_id 값을 찾아냅니다. 이후 그 결과가 메인 쿼리에서 IN 조건을 통해 결과를 필터링하는 데 활용됩니다.
서브쿼리는 아래와 같이 INNER JOIN 형태로도 작성할 수 있습니다.
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
INNER JOIN hangtonkho htk
ON s.sanpham_id = htk.sanpham_id
WHERE htk.soluong > 10;
INNER JOIN은 원래의 서브쿼리보다 일반적으로 더 나은 성능을 보여줍니다. 다만, 모든 쿼리가 JOIN으로 재작성될 수 있는 것은 아니라는 점에 유의해야 합니다.
FROM 절에서의 서브쿼리
SELECT nhacung.nhacung_ten, truyvancon1.tong_sl
FROM nhacung,
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung_id) truyvancon1
WHERE truyvancon1.nhacung_id = nhacung.nhacung_id;
이 예제에서는 FROM 절에 다음과 같이 서브쿼리를 작성했습니다.
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung_id) truyvancon1
이 서브쿼리에는 truyvancon1이라는 별칭(alias)이 지정되어 있습니다. 이 별칭은 해당 서브쿼리 또는 그 결과 필드를 참조할 때 사용되는 이름입니다.
SELECT 절에서의 서브쿼리
SELECT 절의 서브쿼리는 주로 SUM, COUNT, MIN 또는 MAX 같은 집계 함수를 이용해 계산을 수행하면서도, 메인 쿼리 전체에 집계를 적용하지 않고자 할 때 사용됩니다.
SELECT n1.ho, n1.ten,
(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
FROM nhanvien n1;
위 예제에서 생성된 서브쿼리는 다음과 같습니다.
(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
이 서브쿼리 역시 truyvancon2라는 별칭이 지정되어 있으며, 이 이름을 통해 서브쿼리나 그 정보 필드를 참조할 수 있습니다.
SELECT 절에 서브쿼리를 배치하는 기법이 사용되는 이유는, 서브쿼리가 반드시 단일 값(single value)만 반환해야 하기 때문입니다. 따라서 SUM, COUNT, MIN 또는 MAX와 같은 집계 함수가 서브쿼리에서 자주 활용되는 것입니다.