MySQL :: MySQL 9.1 Reference Manual :: 15.2.20 WITH (Common Table Expressions)
공통 테이블 표현식(CTE)이란?
CTE 사용법
WITH 절 사용# WITH절에서 cte1, cte2 정의
# WITH절 뒤에 나오는 최상위 SELECT문에서 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;
명시적 JOIN, 묵시적 JOIN
구문 설명
WITH [RECURSIVE]
cte_name [(col_name [, col_name] ...)] AS (subquery)
[, cte_name [(col_name [, col_name]...)] AS (subquery)] ...
WITH : CTE를 정의할 때 항상 사용되는 키워드RECURSIVE : 재귀적인 CTE를 정의할 때만 추가로 사용되는 키워드cte_name : CTE의 이름, 나중에 메인 쿼리에서 이 이름으로 데이터 참조col_name : (선택) CTE의 열 이름을 정의AS (subquert) : CTE에서 사용할 데이터를 생성하는 서브쿼리 작성CTE의 열 이름 결정 방식
CTE 이름 뒤에 괄호로 묶인 이름 목록이 있는 경우
→ 해당 목록에 지정된 이름들이 열 이름이 됨
WITH cte (col1, col2) AS
(
SELECT 1, 2
UNION ALL
SELECT 3, 4
)
SELECT col1, col2 FROM cte;
CTE 이름 뒤에 이름 목록이 없는 경우
→ AS (subquery) 부분의 첫 번째 SELECT문의 SELECT목록에서 열 이름을 가져옴
WITH cte AS
(
SELECT 1 AS col1, 2 AS col2
UNION ALL
SELECT 3, 4
)
SELECT col1, col2 FROM cte;
자신의 이름을 참조하는 서브쿼리를 포함하는 CTE
# 예시
WITH RECURSIVE cte(n) AS
(
SELECT 1
UNION ALL
SELECT n + 1
FROM cte
WHERE n < 5
)
SELECT * FROM cte;
WITH절
WITH RECURSIVE 로 시작서브쿼리 부분
SELECT
SELECT
FROM 절에서 CTE 이름 참조SELECT ...
UNION ALL
SELECT ...
<aside>
✅ 참고
UNION DISTICT 를 사용하면 중복 행 제거
</aside>