CTE: Common Table Expression
테이블을 표현하는 공통적인 방법이며, 기존의 View, Table로 사용하던 것들을 대신할 수 있다.
서브쿼리를 마치 뷰처럼 사용하므로 더 편리하고, 복잡한 쿼리가 더 간결하고 간편하게 사용가능하다.
➡️ 계속해서 조인을 걸던 방식보다 이렇게 하면 한눈에 보기 편하다 !
WITH 절
with절은 AS를 통해 서브쿼리에이름을 붙여줄 수 있다. CTE를 표현하기 위한 구문이다.
임시테이블을 만드는 점에서 View와 유사하다.
하지만 View는 만들어놓으면 여러 쿼리에서 쓸 수 있지만, With절은 한번 실행할 쿼리문 내에서만 사용할 수 있다.!
자주 사용하는 테이블이다 ! ➡️ View
이때만 사용한다 ➡️ With, 서브쿼리
WITH
cte1 AS (SELECT a, b FROM table1),
cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 INNER JOIN cte2
ON cte1.a = cte2.c;
위와 같은 비재귀적 CTE가 있고, 아래와 같이 재귀적 CTE가 있다.
비재귀적인 CTE는 순차적으로 쿼리 작성이 가능하다. 재귀적인 CTE는 스스로 추가적인 Row를 생성할 수 있다.
WITH RECURSIVE cte (n) AS
(
SELECT 1 -- initial(root) row set . 1이 n으로 들어가고, 그 이후엔 아래 걸로 실행
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5 -- additional row sets
)
SELECT * FROM cte;
재귀 CTE에서 실행 횟수 제한하기
SET SESSION cte_max_recursion_depth = 20; -- 재귀 실행을 20회로 제한
SET SESSION cte_max_recursion_depth = 1000000; -- 재귀 실행을 1M로 제한
SET max_execution_time = 1000; -- 최대 실행 시간을 1000ms까지로 제한
'SQL' 카테고리의 다른 글
[TIL] Index (0) | 2025.05.07 |
---|---|
[MySQL] Routines (0) | 2025.05.06 |
MySQL Architecture와 쿼리 실행 흐름 (0) | 2025.04.30 |