Post

1주차 정규과제(2) - MySQL 공식문서: Common Table Expressions (CTE)

1주차 정규과제(2) - MySQL 공식문서: Common Table Expressions (CTE)

15.2.20 WITH (Common Table Expressions)

Common Table Expressions (공통 테이블 표현식, CTE)

원문 출처: MySQL 8.0 Reference Manual - 15.2.20 WITH (Common Table Expressions)
번역: DArt-B 학회

개요

공통 테이블 표현식(CTE, Common Table Expression)은 하나의 SQL 문(statement) 내에서만 존재하는 이름 있는 임시 결과 집합입니다.
해당 문장에서 여러 번 참조할 수 있으며, 특히 복잡한 쿼리를 구조적으로 나누고 가독성을 높이는 데 유용합니다.

CTE는 다음과 같은 주요 주제를 포함합니다:

  • 일반 CTE (Common Table Expressions)
  • 재귀 CTE (Recursive Common Table Expressions)
  • 재귀 깊이 제한 (Limiting Recursion)
  • 재귀 CTE 예제 (Examples)
  • CTE와 유사한 구조 비교 (Comparison with Similar Constructs)

Common Table Expressions (기본 CTE)

구문

1
2
3
4
5
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;
  • cte1, cte2는 각각의 하위 쿼리(subquery) 결과 집합을 이름으로 정의
  • 이후 SELECT 문에서 마치 테이블처럼 참조 가능
  • CTE 안에서 다른 CTE 참조 가능 (단, 뒤에 정의된 CTE는 참조 불가)

CTE 구문 규칙

  • WITH 절은 SELECT, UPDATE, DELETE 문 앞에 위치할 수 있음
  • INSERT, REPLACE, CREATE TABLE/VIEW, DECLARE CURSOR, EXPLAIN 문에서도 사용 가능
  • 하나의 문장 레벨에는 WITH 절 하나만 허용
  • 여러 CTE는 , 로 구분하여 나열해야 함
  • CTE 이름은 반드시 유일해야 함
  • 이름 해석 순서는 서브쿼리 > CTE > 기본 테이블/뷰 순서

컬럼 이름 결정 규칙

  • CTE 정의 시 (col1, col2, …)처럼 이름을 지정하면 해당 컬럼명 사용
  • 지정하지 않으면 첫 번째 SELECT 문의 select list 에서 컬럼명을 가져옴

WITH RECURSIVE 부분 제외

CTE vs Derived Tables (CTE와 파생 테이블 비교)

  • 공통점: 이름이 있고, 단일 문장에서만 존재

  • 차이점:

    • 파생 테이블은 한 번만 참조 가능
    • CTE는 여러 번 참조 가능
    • CTE는 자기 참조(재귀) 가능
    • 가독성 측면에서 CTE가 유리

CTE는 임시 테이블을 만들 필요 없이, 일시적이고 가벼운 구조로 사용 가능.

1
2
3
WITH cte AS (SELECT 1) SELECT * FROM cte;
-- 동일
SELECT * FROM (SELECT 1) AS dt;
This post is licensed under CC BY 4.0 by the author.