WITH를 이용해 잠깐 쓸 가짜 테이블을 만들어서 사용한다.👉 쉽게 말하면,
SELECT 안에 SELECT 안에 SELECT... 이렇게 복잡하게 말리는 걸 막기 위해,
임시 이름표를 붙여서 계산 결과를 저장하는 것이다.
✅ CTE는 서브쿼리 결과를 미리 저장해두는 역할을 한다.
✅ 즉, 한번 계산해놓고, 이후 쿼리에서는 그 결과를 여러 번 재사용할 수 있다.
✅ 진짜 테이블에 저장되는 건 아니지만, 일시적으로 메모리에 결과를 담아둔다고 이해하면 쉽다.
👉 정리하면,
CTE는 복잡한 계산 결과를 한 번 저장하고, 그걸 깔끔하게 꺼내쓰는 방법이다.
WITH CTE이름 AS (
SELECT ...
)
SELECT ...
FROM CTE이름;
WITH 뒤에 CTE 이름을 정하고, SELECT문에서 마치 진짜 테이블처럼 CTE이름을 FROM절에 넣어서 사용한다.| 이유 | 설명 |
|---|---|
| ✅ 쿼리 가독성 향상 | 서브쿼리를 밖으로 빼서 훨씬 읽기 쉽게 만든다. |
| ✅ 중복 제거 | 같은 서브쿼리를 여러 번 반복해서 쓰지 않아도 된다. |
| ✅ 유지보수 편리 | 쿼리 수정할 때 한 군데만 고치면 된다. |
| ✅ 복잡한 로직 단계 분리 | 계산, 조건, 결과를 따로따로 나눠서 깔끔하게 처리할 수 있다. |
| ✅ 성능 개선 가능 | 복잡한 연산을 미리 해두고 재사용함으로써 불필요한 반복 계산을 줄일 수 있다. |
문제:
HR_GRADE 테이블에서 2022년도 상/하반기 평가 점수를 합산해서,
가장 높은 총점을 받은 사원의 점수, 사번, 이름, 직책, 이메일을 조회하세요.
해결 방법:
CTE를 활용한 SQL:
WITH SCORE_SUM AS (
SELECT
EMP_NO,
SUM(SCORE) AS SCORE
FROM HR_GRADE
WHERE YEAR = 2022
GROUP BY EMP_NO
),
MAX_SCORE AS (
SELECT MAX(SCORE) AS MAX_SCORE
FROM SCORE_SUM
)
SELECT
S.SCORE,
E.EMP_NO,
E.EMP_NAME,
E.POSITION,
E.EMAIL
FROM SCORE_SUM S
JOIN HR_EMPLOYEES E ON S.EMP_NO = E.EMP_NO
JOIN MAX_SCORE M ON S.SCORE = M.MAX_SCORE;
SCORE_SUM
: 사번(EMP_NO)별로 2022년 상/하반기 점수를 합산.
MAX_SCORE
: 합산 점수 중 가장 높은 점수 하나를 구함.
최종 SELECT
: 최고 점수를 받은 사원의 점수, 사번, 이름, 직책, 이메일을 가져옴.
👉 CTE (SCORE_SUM, MAX_SCORE)는 각각 중간 계산 결과를 미리 저장해두고,
최종 결과를 꺼내쓰는 흐름이다.
👉 복잡한 SQL을 깔끔하고 직관적으로 만들려면
CTE를 습관처럼 쓰는 게 좋다.
✅ CTE는 SQL 쿼리를 "임시 테이블"처럼 다루게 해준다.
✅ 복잡한 쿼리를 단계별로 분리해서 읽기 쉽게 만든다.
✅ 중복 제거, 유지보수 편리성, 가독성 향상에 필수적이다.
✅ 복잡한 문제를 풀 때는 항상 "CTE로 나눌 수 있을까?"를 먼저 생각해보자.
✅ 그리고, CTE는 계산 결과를 미리 저장해두고 가져다 쓰는 도구라고 이해하면 쉽다.