[MySQL] WITH 절과 공통 테이블 표현식

2025. 2. 12. 16:48·MySQL
목차
  1. 1. WITH 절과 공통 테이블 표현식 (CTE, Common Table Expression)
  2. 2. WITH 절과 공통 테이블 표현식(CTE)의 특징
  3. 3. 공통 테이블 표현식(CTE)의 동작 원리
  4. 4. WITH 절의 기본 구조
  5. 5. 공통 테이블 표현식(CTE)의 유형
  6. 비재귀적 CTE
  7. 재귀적 CTE
  8. 6. 참고 자료

1. WITH 절과 공통 테이블 표현식 (CTE, Common Table Expression)

WITH 절은 MySQL에서 공통 테이블 표현식(CTE)을 정의하기 위해 사용하는 구문이다.

공통 테이블 표현식(CTE)은 단일 SQL 문 내에서 임시 이름이 붙은 임시 결과 집합으로, 해당 SQL 문 내에서 여러 번 참조하여 사용할 수 있다.

 


2. WITH 절과 공통 테이블 표현식(CTE)의 특징

  • WITH 절과 공통 테이블 표현식은 성능 최적화 관점에서 반복된 서브쿼리를 줄이고 가독성과 유지보수성을 높이는 데 도움을 준다.
  • 중첩된 서브쿼리를 사용하지 않고도 논리적으로 쿼리를 나눌 수 있다.
  • 공통 테이블 표현식은 같은 statement 내에서 여러 번 참조될 수 있으며, 여러 번 참조되더라도 한 번만 실행되어 그 결과가 메모리에 저장된다. 따라서 동일한 데이터를 여러 번 참조해야 할 때 유용하다.
  • 공통 테이블 표현식은 메인 쿼리 실행 중에만 존재한다. 또한 임시 테이블과 달리, 데이터베이스에 물리적으로 생성되지 않고 메모리에서 관리된다.
  • 공통 테이블 표현식은 다른 공통 테이블 표현식을 참조하여 정의될 수 있다.
  • 공통 테이블 표현식은 자기 자신을 참조하여 재귀적으로 정의될 수 있다. 이때는 RECURSIVE 키워드를 함께 사용한다.
  • 옵티마이저는 상황에 따라 공통 테이블 표현식을 메인 쿼리로 병합하여 성능을 향상시킬 수 있다.

3. 공통 테이블 표현식(CTE)의 동작 원리

  • 공통 테이블 표현식은 먼저 정의된 쿼리를 실행한 후 메모리에 그 결과가 저장된다.
  • 이후 메인 쿼리에서 이 임시 결과를 참조하거나, 다른 CTE와 결합하여 사용한다.
  • 쿼리 실행이 끝나면 공통 테이블 표현식은 메모리에서 사라지며 데이터베이스에 저장되지 않는다.

4. WITH 절의 기본 구조

메인 쿼리의 SELECT 절 앞에서 WITH 절을 사용하여 표현한다.

WITH cte_name AS (
    SELECT column1, column2
    FROM table_name
    WHERE condition
)
SELECT *
FROM cte_name;

 

여러 개의 CTE를 정의할 경우에는 , 로 구분하여 작성한다.

WITH cte1 AS (
    SELECT a, b
    FROM table1
),
cte2 AS (
    SELECT c, d
    FROM table2
)
SELECT b, d
FROM cte1
JOIN cte2
WHERE cte1.a = cte2.c;

 


5. 공통 테이블 표현식(CTE)의 유형

비재귀적 CTE

단순히 결과 집합을 정의하는 기본적인 형태의 CTE이다.

 

재귀적 CTE

RECURSIVE 키워드를 사용하여 자기 자신을 참조하는 쿼리를 작성할 수 있다. 이러한 재귀적 CTE는 반드시 종료 조건을 포함해야 한다.

MySQL 공식 문서에서는 아래와 같은 예시를 제시하고 있다.

WITH RECURSIVE cte (n) AS (
    SELECT 1
    UNION ALL
    SELECT n + 1
    FROM cte
    WHERE n < 5
)
SELECT *
FROM cte;

 

위의 쿼리를 실행한 결과는 아래와 같다.

+------+
| n    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

 

또한 cte_max_recursion_depth 시스템 변수를 통해 재귀의 최대 깊이를 제한할 수 있다.

 


6. 참고 자료

  1. https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive
  2. https://mooonstar.tistory.com/entry/MySQLWITH문을-사용하여-가상의-테이블을-만들어-사용하기
  3. https://inpa.tistory.com/entry/MYSQL-📚-WITH-임시-테이블

 

(2025.01.02 목 작성)

(2025.02.12 수 수정 및 업로드)

 

'MySQL' 카테고리의 다른 글

[MySQL] IN과 EXISTS의 차이  (0) 2025.02.12
  1. 1. WITH 절과 공통 테이블 표현식 (CTE, Common Table Expression)
  2. 2. WITH 절과 공통 테이블 표현식(CTE)의 특징
  3. 3. 공통 테이블 표현식(CTE)의 동작 원리
  4. 4. WITH 절의 기본 구조
  5. 5. 공통 테이블 표현식(CTE)의 유형
  6. 비재귀적 CTE
  7. 재귀적 CTE
  8. 6. 참고 자료
'MySQL' 카테고리의 다른 글
  • [MySQL] IN과 EXISTS의 차이
인피케이
인피케이
꾸준히 성장하는 개발자, 인피케이의 블로그입니다. 백준과 깃허브 등 여러 플랫폼에서 인피케이로 활동하고 있습니다.
인피케이 블로그꾸준히 성장하는 개발자, 인피케이의 블로그입니다. 백준과 깃허브 등 여러 플랫폼에서 인피케이로 활동하고 있습니다.
인피케이
인피케이 블로그
인피케이
전체
오늘
어제
  • 분류 전체보기 (31)
    • Algorithm (5)
    • Baekjoon (11)
    • Java (2)
    • C++ (1)
    • Python (3)
    • MarkDown (1)
    • Database (2)
    • MySQL (2)
    • React Native (1)
    • VS Code (1)
    • SSAFY (1)
    • IT (1)

블로그 메뉴

  • 홈
  • 방명록
  • 태그
  • 글쓰기

공지사항

  • 인피케이 프로필

인기 글

태그

개발지식
개발자
문법
Database
히르쉬버그
데이터베이스
Python
SQL
티스토리
백준
C++
최장공통부분수열
알고리즘
개발환경
가장긴증가하는부분수열
카톡테마블로그
정수론
CS
m1맥
MySQL
적성진단
jdk
HTML
파이썬
java
baekjoon
BOJ
인피케이
수학
유클리드알고리즘

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.3
인피케이
[MySQL] WITH 절과 공통 테이블 표현식

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.