학습 자료

공통 테이블 식(CTE)

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

CTE를 활용하면 복잡한 쿼리를 더 읽기 쉽게, 구조화하기 쉽게, 그리고 유지보수하기 쉽게 만들 수 있습니다.

이번 수업에서는 비재귀 CTE를 다룹니다.

즉, CTE가 자기 자신을 반복적으로 호출하지 않고 한 번만 사용하는 경우입니다.


문법

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

CTE 문법
WITH cte_name AS ( SELECT ... FROM ... WHERE ... ) SELECT * FROM cte_name;
  • WITH: CTE 블록을 정의
  • cte_name: 메인 쿼리에서 참조할 수 있는 임시 테이블명
  • 메인 쿼리에서 CTE를 일반 테이블처럼 사용 가능

예시: 두 개 이상 강의를 수강한 사용자 찾기

다음 쿼리는 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. multi_course_users CTE에서 두 개 이상 강의를 수강한 사용자 ID와 강의 개수를 계산
  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;
  • active_users: 강의를 수강한 사용자 목록
  • recent_users: 이름이 S로 시작하는 사용자 목록

메인 쿼리에서 두 CTE를 Join하여 교집합을 조회합니다.


CTE를 활용하면 복잡한 Join이나 중첩 서브쿼리를 깔끔하게 정리할 수 있어, 데이터 분석이나 리포트 작성에서 특히 유용합니다.

Quiz
0 / 1

SQL에서 공통 테이블 식(CTE)을 사용하는 주된 목적은 무엇인가요?

데이터베이스에 데이터를 영구적으로 저장하기 위해서.

여러 쿼리를 동시에 실행하기 위해서.

복잡한 쿼리를 더 작은 부분으로 나누어 간소화하기 위해서.

SQL 쿼리 실행 속도를 높이기 위해서.

학습 자료

AI 튜터

디자인

업로드

수업 노트

즐겨찾기

도움말

코드 에디터

코드 실행
코드 생성

DB 테이블 구조

실행 결과