SQL CTE (WITH)

창하쿠·2025년 4월 28일

🟦 CTE란?

  • CTE는 Common Table Expression의 줄임말이다.
  • 말 그대로 공통적으로 사용할 임시 결과 테이블을 만드는 기능이다.
  • SQL 쿼리 안에서 WITH를 이용해 잠깐 쓸 가짜 테이블을 만들어서 사용한다.
  • 새로 진짜 테이블을 만드는 게 아니라, 그 쿼리 안에서만 유효한 결과를 다루는 것이다.

👉 쉽게 말하면,
SELECT 안에 SELECT 안에 SELECT... 이렇게 복잡하게 말리는 걸 막기 위해,
임시 이름표를 붙여서 계산 결과를 저장하는 것이다.


🟦 CTE 핵심 개념 ✨

CTE는 서브쿼리 결과를 미리 저장해두는 역할을 한다.
✅ 즉, 한번 계산해놓고, 이후 쿼리에서는 그 결과를 여러 번 재사용할 수 있다.
✅ 진짜 테이블에 저장되는 건 아니지만, 일시적으로 메모리에 결과를 담아둔다고 이해하면 쉽다.

👉 정리하면,
CTE는 복잡한 계산 결과를 한 번 저장하고, 그걸 깔끔하게 꺼내쓰는 방법이다.


🟦 CTE 기본 구조

WITH CTE이름 AS (
    SELECT ...
)
SELECT ...
FROM CTE이름;
  • WITH 뒤에 CTE 이름을 정하고,
  • 그 안에 원하는 서브쿼리를 작성한다.
  • 이후에 SELECT문에서 마치 진짜 테이블처럼 CTE이름을 FROM절에 넣어서 사용한다.

🟦 CTE를 쓰는 이유

이유설명
✅ 쿼리 가독성 향상서브쿼리를 밖으로 빼서 훨씬 읽기 쉽게 만든다.
✅ 중복 제거같은 서브쿼리를 여러 번 반복해서 쓰지 않아도 된다.
✅ 유지보수 편리쿼리 수정할 때 한 군데만 고치면 된다.
✅ 복잡한 로직 단계 분리계산, 조건, 결과를 따로따로 나눠서 깔끔하게 처리할 수 있다.
✅ 성능 개선 가능복잡한 연산을 미리 해두고 재사용함으로써 불필요한 반복 계산을 줄일 수 있다.

🟦 간단 예제 - 문제와 풀이

문제:

HR_GRADE 테이블에서 2022년도 상/하반기 평가 점수를 합산해서,
가장 높은 총점을 받은 사원의 점수, 사번, 이름, 직책, 이메일을 조회하세요.

해결 방법:

  • 1단계: 2022년도 사원의 상반기+하반기 평가 점수를 합산
  • 2단계: 합산 점수 중 가장 높은 점수를 찾음
  • 3단계: 최고 점수를 받은 사원의 정보를 조회

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;

📌 이 쿼리 해석

  1. SCORE_SUM
    : 사번(EMP_NO)별로 2022년 상/하반기 점수를 합산.

  2. MAX_SCORE
    : 합산 점수 중 가장 높은 점수 하나를 구함.

  3. 최종 SELECT
    : 최고 점수를 받은 사원의 점수, 사번, 이름, 직책, 이메일을 가져옴.

👉 CTE (SCORE_SUM, MAX_SCORE)는 각각 중간 계산 결과를 미리 저장해두고,
최종 결과를 꺼내쓰는 흐름이다.


🟦 CTE를 쓰면 쿼리가 왜 쉬워지나?

  • 서브쿼리 중첩 없이 한눈에 로직 흐름이 보인다.
  • 단계별로 쿼리를 나눠서 작성할 수 있다.
  • 읽고 수정하기 쉬워진다. (나중에 유지보수 편함)
  • 필요한 계산을 미리 저장해두고 가져다 쓰는 방식이라 성능적으로도 이점이 있다.

👉 복잡한 SQL을 깔끔하고 직관적으로 만들려면
CTE를 습관처럼 쓰는 게 좋다.


🟦 최종 요약

✅ CTE는 SQL 쿼리를 "임시 테이블"처럼 다루게 해준다.
✅ 복잡한 쿼리를 단계별로 분리해서 읽기 쉽게 만든다.
✅ 중복 제거, 유지보수 편리성, 가독성 향상에 필수적이다.
✅ 복잡한 문제를 풀 때는 항상 "CTE로 나눌 수 있을까?"를 먼저 생각해보자.
✅ 그리고, CTE는 계산 결과를 미리 저장해두고 가져다 쓰는 도구라고 이해하면 쉽다.

profile
아무것도 모르는 아무개

0개의 댓글