- CTE는 SQL에서 쿼리 안에서 일시적으로 생성되는 임시 결과 집합입니다.
- WITH 키워드를 사용하여 정의하며, 하나의 쿼리에서 반복적으로 사용할 수 있고 가독성과 성능 최적화에 매우 유용합니다.
CTE 기본 구조
WITH cte_name AS (
SELECT 컬럼1, 컬럼2
FROM 테이블
WHERE 조건
)
SELECT * FROM cte_name;
CTE의 장점
- 복잡한 쿼리 단순화 : 긴 쿼리를 여러 단계로 나눠 작성할 수 있습니다.
- 재사용성 : 하나의 CTE를 여러 번 호출해도 실제 실행은 한 번만 수행됩니다.
- 가독성 : 코드가 더 깔끔해지고 유지보수가 쉬워집니다.
- 임시 테이블 대체 : 세션마다 유지되는 임시 테이블을 생성하지 않아도 됩니다.
예제 1: 중복 계산 방지
WITH dept_avg AS (
SELECT department_id, AVG(salary) avg_salary
FROM employees
GROUP BY department_id
)
SELECT e.employee_id, e.first_name, e.salary, d.avg_salary
FROM employees e
JOIN dept_avg d ON e.department_id = d.department_id
WHERE e.salary > d.avg_salary;- dept_avg CTE에서 AVG(salary)를 한 번만 계산하고, 이후의 JOIN에서 반복적으로 사용합니다.
예제 2: 재귀 CTE 사용 (자기 자신 호출)
WITH RECURSIVE emp_hierarchy (emp_id, manager_id, level) AS (
SELECT employee_id, manager_id, 1
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.manager_id, h.level + 1
FROM employees e
JOIN emp_hierarchy h ON e.manager_id = h.emp_id
)
SELECT * FROM emp_hierarchy;- 재귀 CTE를 사용하여 상위 관리자부터 하위 직원까지 계층 구조를 탐색할 수 있습니다.
CTE 활용 팁
- 동일한 서브쿼리를 여러 번 작성할 필요 없이 한 번 작성하고 반복 사용.
- WITH절을 사용하여 쿼리를 단계별로 작성하면 쿼리 튜닝이 더 쉬워집니다.
- 대규모 데이터 처리 시에도 성능 향상에 효과적입니다.