728x90
※ SQL: Correlation. (Correlated subquery)
안녕하세요. 듀스트림입니다.
오늘 포스팅은 상관 서브쿼리에 관련된 내용입니다.
SQL에서 상관관계(Correlation)란?
주로 상관 서브쿼리(correlated subquery)를 의미하며,
"서브쿼리가 실행될 때, 바깥 쿼리의 컬럼을 참조하는 관계"를 말합니다.
즉, 서브쿼리가 독립적으로 실행되지 못하고,
외부 쿼리의 각 행에 대해 내부 쿼리가 반복적으로 실행되는 구조를 의미합니다.
1. 비상관 서브쿼리 (Non-correlated Subquery)
서브쿼리가 독립적으로 실행 가능합니다.
SELECT emp_name, salary
FROM emp
WHERE salary > (SELECT AVG(salary) FROM emp);
- (SELECT AVG(salary) FROM emp)는 한 번만 계산됩니다.
- 외부 쿼리(emp 테이블 전체)와 상관없습니다.
→ 효율적 (1회 실행)
2. 상관 서브쿼리 (Correlated Subquery)
서브쿼리가 외부 쿼리 컬럼(emp.deptno)을 참조합니다.
SELECT e.emp_name, e.deptno, e.salary
FROM emp e
WHERE e.salary > (
SELECT AVG(e2.salary)
FROM emp e2
WHERE e2.deptno = e.deptno
);
- 서브쿼리 내부에서 e.deptno (외부 쿼리의 컬럼)를 사용합니다.
- 결과적으로 emp의 각 행마다 서브쿼리가 실행됩니다.
→ 실행 횟수 = 외부 행 수만큼 (비효율적일 수 있음)
3. 실행 흐름 요약
| 단계 | 설명 |
| 1 | 외부 쿼리에서 한 행을 선택 |
| 2 | 해당 행의 컬럼 값이 서브쿼리로 전달됨 |
| 3 | 서브쿼리가 실행되어 결과를 반환 |
| 4 | WHERE 조건을 평가 |
| 5 | 모든 행에 대해 반복 실행 |
4. 상관관계의 핵심 특징
| 구분 | 설명 |
| 의존성 | 서브쿼리가 외부 쿼리의 컬럼에 의존 |
| 실행 방식 | 외부 쿼리의 각 행마다 서브쿼리 반복 실행 |
| 성능 | 느릴 수 있음 (Nested Loop처럼 작동) |
| 최적화 | 가능하다면 JOIN으로 변환 권장 |
+ JOIN으로 대체 가능
위의 상관 서브쿼리는 아래처럼 집계 JOIN으로 바꿀 수 있습니다.
SELECT e.emp_name, e.deptno, e.salary
FROM emp e
JOIN (
SELECT deptno, AVG(salary) AS avg_salary
FROM emp
GROUP BY deptno
) d
ON e.deptno = d.deptno
WHERE e.salary > d.avg_salary;
- 서브쿼리를 한 번만 실행합니다. (GROUP BY 후 JOIN)
→ 성능 향상, 병렬 처리 및 인덱스 활용 가능
++ 요약
| 항목 | 설명 |
| 정의 | 내부 쿼리가 외부 쿼리 컬럼을 참조하는 관계 |
| 장점 | 논리적으로 직관적, 이해하기 쉬움 |
| 단점 | 반복 실행 → O(N²) 구조 가능 |
| 튜닝 방법 | JOIN / CTE 변환, 인덱스 활용 |
| 주요 증상 | EXPLAIN 시 Nested Loop 반복으로 표시됨 |
| 대안 | GROUP BY, 윈도우 함수, EXISTS 최적화 |
오늘은 여기까지~
728x90
'SQL' 카테고리의 다른 글
| SQL: 윈도우 함수 문법 구조 (0) | 2025.11.24 |
|---|---|
| SQL: 행 스트림 (0) | 2025.11.17 |
| SQL: 실행 순서 (0) | 2025.10.24 |
| SQL: EXISTS / NOT EXISTS (0) | 2025.10.15 |
| SQL: ASC, DESC (0) | 2025.10.13 |