[MySQL] WITH, WITH RECURSIVE

SCY·2023년 10월 5일
0
post-thumbnail

WITH 구문

  • 메모리 상에 가상 테이블 저장
  • RECURSIVE 여부에 따라 재귀와 비재귀 두 방법으로 사용 가능
  • 쿼리 내에서 임시 결과를 정의하고 사용할 때 유용
  • 동일한 SQL이 반복되어 사용될 때 성능 상승

비슷하게 동작하는 와의 차이점: 는 별칭만 지정하는 것이므로 쿼리문이 그대로 실행된다. 그러나 WITH는 가상의 테이블을 생성한다.

장시간 걸리는 쿼리의 결과를 저장해놓고 저장해놓은 데이터를 엑세스하기 때문에 성능이 좋다. 대신 메모리를 차지하는 단점이 있다.

예시 1 )

WITH TBL AS (
	SELECT '철수' AS NAME, 20 AS AGE
	UNION ALL
	SELECT NAME, AGE
	  FROM TB1
)

SELECT NAME, AGE FROM TBL;

예시 2 )

# UNION 결과 : 1,2 출력

SELECT 1 AS num
UNION
SELECT 2 AS num;
# WITH, UNION 결과 : 1,2 출력

WITH test AS
(
  SELECT 1 AS num
  UNION ALL
  SELECT 2 AS num
)

SELECT * FROM test;
# WITH, UNION 결과 : 1,2,2,2,... (emp테이블의 행수만큼 2 반복)

WITH test AS
(
  SELECT 1 AS num
  UNION ALL
  SELECT 2 AS num FROM emp # 이 문장은 emp 테이블의 행수만큼 반복된다
)

SELECT * FROM test;

WITH RECURSIVE (재귀 쿼리)

WITH RECURSIVE 쿼리문을 작성하고 내부에 UNION을 통해 재귀를 구성한다.

예시 ) 0부터 10까지의 값을 갖는 가상 테이블 생성

WITH RECURSIVE CTE AS(
    SELECT 0 AS NUM - 초깃값
    UNION ALL
    SELECT NUM + 1
    FROM CTE
    WEHRE NUM < 10 - 정지 조건
)

관련 문제
프로그래머스 입양 시각 구하기(2)

profile
성장 중독 | 서버, 데이터, 정보 보안을 공부합니다.

0개의 댓글