CTE가 필요한 경우

이런 상황들을 생각해보자.

이렇게 계층의 깊이를 모르는, 가변적인 상황에서 모든 자손을 찾으라는 요구사항을 처리할면 결국 재귀가 필요하다. mySQL은 8.0부터 CTE를 지원해서 이런 문제를 SQL로 해결할 수 있게 되었다.

💡 CTE는 SQL 표준이다. mySQL뿐만 아니라 다른 DB에서도 CTE는 사용할 수 있음.

CTE란?

사실 CTE는 재귀에만 쓰이는게 아니다. CTE는 쿼리 내에서 임시로 사용할 수 있는 이름있는 결과집합을 말한다.

해당 SQL내에서만 잠시 존재하는 view로 생각할 수도 있다.

CTE는 WITH 절을 사용해 정의한다.

-- ## CTE와 재귀 쿼리 1

-- #### 기본 CTE 문법

WITH cte_name AS (
  -- CTE를 정의하는 쿼리
  SELECT ...
)
-- CTE를 사용하는 메인 쿼리
SELECT * FROM cte_name;

간단한 예제를 살펴보자.

WITH top_categories AS (
  SELECT * FROM category WHERE parent_id IS NULL
)
SELECT * FROM top_categories;

참고로 위의 WITH xxx AS (...) 가 CTE를 사용하는 문법이고 아래 SELECT문과 이어지는 하나의 쿼리이다. 아래 SELECT문에서 위의 WITH 절에서 만든 임시 결과집합인 top_categories 를 사용할 수 있다.