SQL 고급 서브쿼리 - 다단계 중첩과 상관 서브쿼리
선수학습(1개)
요약
여러 겹의 서브쿼리와 바깥 쿼리의 행을 참조하는 상관 서브쿼리를 단계별로 해석합니다.
기본 서브쿼리를 먼저 익힌 뒤 학습합니다. 여기서 다단계 중첩은 서브쿼리 안에 또 서브쿼리가 있는 형태를 뜻합니다. WHERE 안에 SELECT 하나를 넣는 기본 형태까지 모두 고급으로 분류하는 것은 아닙니다. 조인을 함께 사용한다면 JOIN도 먼저 확인하세요.
중첩 서브쿼리 해석 순서
서브쿼리가 여러 겹으로 중첩된 경우, 가장 안쪽 서브쿼리부터 바깥쪽으로 순서대로 해석합니다.
풀이 순서: ① → ② → ③
상관 서브쿼리 (Correlated Subquery)
바깥 쿼리의 값을 서브쿼리가 참조하는 형태입니다. 바깥 쿼리의 각 행마다 서브쿼리가 다시 실행되므로, 일반 서브쿼리와 달리 "한 번 실행 후 값 치환" 방식이 아닙니다.
예시:
사원 테이블:
| 사원번호 | 이름 | 부서번호 | 급여 |
|---|---|---|---|
| 1 | 김감자 | 10 | 3000 |
| 2 | 이고구마 | 10 | 4000 |
| 3 | 박옥수수 | 20 | 3500 |
| 4 | 최참외 | 20 | 2500 |
단계별 풀이:
1단계 바깥 쿼리가 사원 e1의 첫 행(김감자, 부서번호 10, 급여 3000)을 꺼냅니다.
2단계 서브쿼리 실행 — e1.부서번호에 10이 대입되어, 부서번호 = 10인 사원(김감자·이고구마)의 평균 급여를 계산합니다: (3000 + 4000) / 2 = 3500.
3단계 급여(3000) > 3500 → FALSE이므로 김감자는 결과에서 제외됩니다.
4단계 바깥 쿼리가 다음 행(이고구마)을 꺼내고, 서브쿼리는 다시 실행되어 같은 부서 평균 3500을 반환 → 4000 > 3500 → TRUE, 이고구마 포함.
5단계 박옥수수(부서 20): 서브쿼리가 부서 20 사원(박옥수수·최참외)의 평균 3000을 반환 → 3500 > 3000 → TRUE, 포함.
6단계 최참외(부서 20): 평균 3000 → 2500 > 3000 → FALSE, 제외.
최종 결과:
| 이름 | 급여 |
|---|---|
| 이고구마 | 4000 |
| 박옥수수 | 3500 |