다중행 서브쿼리(Multi-Row Subquery), 여러 개의 결과 행을 반환하는 서브쿼리로, 일반적으로 WHERE 절이나 HAVING 절에서 사용됩니다. 다중행 서브쿼리는 데이터 비교, 필터링, 그리고 분석 작업에서 강력한 도구로 활용됩니다.
다중행 서브쿼리의 특징
다중행 서브쿼리는 다음과 같은 특징을 가집니다:
-
여러 행을 반환: 단일 값이 아닌 여러 개의 행을 결과로 반환합니다.
-
특정 비교 연산자 사용: 다중행 서브쿼리의 결과를 비교하기 위해
IN
,ANY
,ALL
연산자를 자주 사용합니다. -
주로 WHERE 절에서 사용: 필터링 조건으로 데이터를 선택할 때 활용됩니다.
다중행 서브쿼리의 주요 연산자
(1) IN
-
서브쿼리의 결과 중 하나와 일치하는 값을 찾습니다.
예제
SELECT 직원ID, 이름, 부서ID
FROM 직원
WHERE 부서ID IN (
SELECT 부서ID
FROM 부서
WHERE 지역 = '서울'
);
-
위 쿼리는 서울에 있는 부서에 속한 직원들의 정보를 반환합니다.
(2) ANY
-
서브쿼리 결과의 하나 이상과 비교 조건을 만족하는 행을 찾습니다.
예제
SELECT 직원ID, 이름, 급여
FROM 직원
WHERE 급여 > ANY (
SELECT 급여
FROM 직원
WHERE 부서ID = 10
);
-
부서ID가 10인 직원 중 최소 급여보다 더 높은 급여를 받는 직원의 정보를 반환합니다.
(3) ALL
-
서브쿼리 결과의 모든 값과 비교 조건을 만족하는 행을 찾습니다.
예제
SELECT 직원ID, 이름, 급여
FROM 직원
WHERE 급여 > ALL (
SELECT 급여
FROM 직원
WHERE 부서ID = 20
);
-
부서ID가 20인 직원의 급여보다 모두 높은 급여를 받는 직원의 정보를 반환합니다.
다중행 서브쿼리와 단일행 서브쿼리의 차이
항목 | 단일행 서브쿼리 | 다중행 서브쿼리 |
---|---|---|
결과 | 하나의 값(단일 행)만 반환 | 여러 개의 값(다중 행)을 반환 |
연산자 | =, <>, >, < 등 단일 비교 연산자 사용 | IN, ANY, ALL 등 다중행 비교 연산자 사용 |
사용 상황 | 특정 조건에 단일 값을 필요로 할 때 | 여러 조건과 비교하거나 여러 값을 필터링할 때 |
다중행 서브쿼리의 활용 사례
(1) 다중행 서브쿼리를 활용한 데이터 비교
SELECT 제품ID, 제품명, 가격
FROM 제품
WHERE 가격 IN (
SELECT MAX(가격)
FROM 제품
GROUP BY 카테고리ID
);
-
각 카테고리에서 가장 비싼 제품의 정보를 반환합니다.
(2) 다중행 서브쿼리를 사용한 데이터 필터링
SELECT 직원ID, 이름
FROM 직원
WHERE 부서ID IN (
SELECT 부서ID
FROM 부서
WHERE 지역 = '부산'
);
-
부산에 위치한 부서의 직원 정보를 반환합니다.
(3) ANY와 ALL을 조합한 복잡한 비교
SELECT 직원ID, 이름, 급여
FROM 직원
WHERE 급여 > ANY (
SELECT 급여
FROM 직원
WHERE 직급 = '사원'
)
AND 급여 < ALL (
SELECT 급여
FROM 직원
WHERE 직급 = '부장'
);
-
사원의 급여보다 높고, 부장의 급여보다 낮은 직원 정보를 반환합니다.
다중행 서브쿼리 사용 시 주의점
-
연산자 선택
-
IN, ANY, ALL 중 올바른 연산자를 선택해야 합니다. 잘못된 연산자 사용은 예상치 못한 결과를 초래할 수 있습니다.
-
-
성능 최적화
-
서브쿼리가 매우 큰 데이터를 반환할 경우 성능 문제가 발생할 수 있으므로, 인덱스 최적화나 JOIN으로 대체할 수 있는지 검토해야 합니다.
-
-
NULL 처리
-
서브쿼리 결과에 NULL 값이 포함되면 조건 비교가 예상과 다르게 작동할 수 있습니다. 따라서 NULL 값을 적절히 처리해야 합니다.
-
결론
다중행 서브쿼리는 SQL에서 복잡한 데이터 비교와 필터링 작업을 효율적으로 수행할 수 있는 강력한 도구입니다. IN, ANY, ALL과 같은 연산자를 활용하면 다양한 시나리오에 적합한 데이터를 선택할 수 있습니다. 그러나 성능 최적화와 NULL 값 처리 등 주의할 점도 반드시 고려해야 합니다.