[MySQL] 재귀 쿼리

hyobbang·2022년 7월 16일
post-thumbnail

재귀쿼리란?

가상의 테이블을 만들고, 그 테이블의 값을 참조하여 값을 결정하기 위해 사용되는 쿼리문이다. 자기 자신을 참조하기 때문에 재귀쿼리라고 불린다.

WITH RECURSIVE test AS ( 
    -- Non-Recursive 문장( 첫번째 루프에서만 실행됨 )
    SELECT 1 AS num
    UNION ALL
    -- Recursive 문장(읽어 올 때마다 행의 위치가 기억되어 다음번 읽어 올 때 다음 행으로 이동함)
    SELECT num+1 AS num FROM test WHERE num<10
)
 
SELECT * FROM test;

재귀쿼리의 조건

  • 반드시 UNION을 사용해야한다.
    문법 상 SELECT를 무조건 두 번 사용해야하기 때문에 UNION이 꼭 필요하다.

  • 비반복문(Non-Recursive 문장)이 최소한 1개 요구된다. 처음 한 번만 실행된다.
    비반목문이란 처음 적는 SELECT를 의미한다.

  • 가상 테이블을 참조하는 문장(반복문, Recursive 문장)이 반드시 필요하다.

  • 반복되는 문장은 반드시 정지조건이 요구된다.
    WHERE절에 쓰는 문장이 정지조건이다. 조건을 쓰지 않으면 무한루프문이 되므로 주의해야한다.

사용예시

  • 프로그래머스 입양 시각 구하기(2)
with recursive rc as (
    select 0 as hour
    union all
    select hour+1 from rc where hour<23
)
 
select 
    rc.hour, 
    count(hour(A.datetime)) as count
from rc
left join animal_ins as A
on rc.hour = hour(A.datetime) -- 재귀숫자와 datetime 시간숫자가 같은 것만
group by rc.hour -- 집계함수를 썼으니 그룹핑, 안그러면 다 더해서 레코드 하나만 반환

Reference

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-RECURSIVE-%EC%9E%AC%EA%B7%80-%EC%BF%BC%EB%A6%AC

profile
매일 따끈따끈한 빵을 굽는 베이커리처럼 코딩하기

0개의 댓글