본문으로 건너뛰기
실습하기

공통 테이블 식(CTE)

공통 테이블 식(Common Table Expression, CTE)WITH 절로 정의하는 임시 결과 집합입니다.

CTE를 사용하면 SQL을 더 읽기 쉽고, 구조화하기 쉽고, 재사용하기 쉬워집니다.

이번 레슨에서는 비재귀 CTE를 살펴봅니다.

즉, CTE가 자기 자신을 호출하지 않고, 간단한 로직이나 필터링을 위해 한 번만 사용하는 경우를 말합니다.


문법

CTE의 기본 문법은 다음과 같습니다.

CTE 문법
WITH cte_name AS (
SELECT ...
FROM ...
WHERE ...
)
SELECT *
FROM cte_name;
  • WITH은 CTE 블록을 정의합니다
  • 메인 쿼리는 이를 일반 테이블처럼 참조합니다

예시: 2개 이상의 강의를 선택한 사용자

다음 쿼리는 2개 이상 강의를 선택한 사용자를 반환합니다.

CTE 예제
WITH multi_course_users AS (
SELECT user_id, COUNT(*) AS course_count
FROM user_courses
GROUP BY user_id
HAVING COUNT(*) >= 2
)
SELECT u.name, m.course_count
FROM multi_course_users m
JOIN users u ON u.user_id = m.user_id
ORDER BY u.name;

출력:

namecourse_count
Aisha2
Sofia2

이 쿼리는 다음을 수행합니다.

  1. CTE(multi_course_users)를 만들어 최소 2개 이상의 강의를 선택한 사용자를 찾습니다.
  2. 이를 users 테이블과 Join해 이름과 수강 수를 출력합니다.

CTE 사용의 이점

  • 가독성: 큰 쿼리를 관리 가능한 부분으로 나눕니다
  • 모듈성: 일부를 테스트하고 재사용하기가 쉽습니다
  • 유지보수성: 로직이 분리되어 있어 변경이 수월합니다

여러 개의 CTE

쉼표로 구분해 여러 개의 CTE를 정의할 수 있습니다.

여러 개의 CTE
WITH active_users AS (
SELECT DISTINCT user_id FROM user_courses
),
recent_users AS (
SELECT * FROM users WHERE name LIKE 'S%'
)
SELECT *
FROM active_users a
JOIN recent_users r ON a.user_id = r.user_id;

이 쿼리는 user_id 컬럼을 기준으로 두 CTE를 Join합니다.

다음 내용이 궁금하다면?

코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!