Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL Server

SQL Server 서브쿼리(Subquery) 완벽 가이드: 문법과 실전 예제

SQL Server 서브쿼리(Subquery) 완벽 가이드

이 글에서는 SQL Server에서 서브쿼리를 사용하는 방법을 문법과 실제 예제와 함께 자세히 살펴봅니다.

SQL에서 서브쿼리란 무엇인가?

SQL Server에서 서브쿼리(subquery)란 다른 쿼리 내부에 포함된 쿼리를 의미합니다. 하나의 SQL 명령문 안에 또 다른 쿼리를 작성할 수 있으며, 이러한 서브쿼리는 WHERE, FROM 또는 SELECT 절에 위치할 수 있습니다.

참고 사항:

  1. 서브쿼리는 INNER QUERY(내부 쿼리) 또는 INNER SELECT라고도 불립니다.
  2. 서브쿼리를 포함하는 메인 쿼리는 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와 같은 집계 함수가 서브쿼리에서 자주 활용되는 것입니다.