이번에는 SQL에서 복잡한 쿼리를 더 명확하게 작성하고 재사용할 수 있도록 도와주는 WITH 절, 즉 공통 테이블 표현식(CTE: Common Table Expression) 에 대해 알아봅시다!
CTE는 특히 서브쿼리를 여러 번 중복해서 쓰지 않아도 되도록 하고, 쿼리 가독성과 유지보수성을 높여주는 장점이 있습니다.
💡 모든 예시도
company_db의employees,projects테이블 기반으로 작성됩니다.
WITH cte_name AS (
SELECT ...
)
SELECT *
FROM cte_name;
cte_name: 임시로 사용할 테이블 이름WITH avg_salary AS (
SELECT AVG(salary) AS avg_val
FROM employees
)
SELECT e.first_name, e.salary
FROM employees e, avg_salary
WHERE e.salary > avg_salary.avg_val;
| first_name | salary |
|---|---|
| Alice | 6500.50 |
| Charlie | 7100.00 |
WITH dept_avg AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT * FROM dept_avg;
| department | avg_salary |
|---|---|
| Engineering | 6800.25 |
| Marketing | 5400.00 |
| HR | 4300.75 |
WITH project_avg AS (
SELECT emp_id, AVG(budget) AS avg_budget
FROM projects
GROUP BY emp_id
)
SELECT e.first_name, p.project_name, p.budget
FROM employees e
JOIN projects p ON e.emp_id = p.emp_id
JOIN project_avg a ON p.emp_id = a.emp_id
WHERE p.budget > a.avg_budget;
| first_name | project_name | budget |
|---|---|---|
| Alice | AI Platform | 100000.00 |
| 특징 | 설명 |
|---|---|
| 재사용성 향상 | 같은 서브쿼리를 여러 번 쓸 필요 없이 재사용 가능 |
| 가독성 향상 | 복잡한 중첩 SELECT문을 분리해 구조 명확화 |
| 유지보수 용이 | CTE 이름만 바꾸면 전체 쿼리 수정 없이 재활용 가능 |
| 다중 CTE 지원 | 쉼표(,)로 여러 CTE를 함께 정의할 수 있음 |
다음 파트에서는 조건에 따라 서로 다른 값을 반환할 수 있는 CASE WHEN 문을 알아볼게요 😉