공부/MySQL

[MySQL] 재귀 쿼리

순제로 2024. 4. 12. 00:14
728x90

재귀 쿼리는 특정 규칙에 따라 반복해서 쿼리를 실행하여 그 결과를 합치는 방식으로, 계층형 데이터나 연결 리스트 등을 처리할 때 유용합니다.

MySQL에서는 Common Table Expression(CTE)을 사용하여 재귀 쿼리를 구현할 수 있습니다. 이 기능은 MySQL 8.0 버전부터 지원됩니다.

1. CTE 기본 구조

CTE(Common Table Expression)는 WITH 절을 사용하여 정의됩니다. 재귀 쿼리를 작성하기 전에 CTE의 기본 구조를 이해하는 것이 중요합니다.

WITH 임시테이블이름 AS (
    -- 여기에 쿼리 작성
)
SELECT * FROM 임시테이블이름;

2. 재귀 CTE의 구조

재귀 CTE는 초기 쿼리(Anchor member)와 재귀적으로 실행될 쿼리(Recursive member)로 구성됩니다. 두 부분은 UNION ALL로 연결됩니다.

WITH RECURSIVE 임시테이블이름 AS (
    -- 초기 쿼리: 재귀의 시작점
    SELECT ...
    UNION ALL
    -- 재귀 쿼리: 이전 결과를 바탕으로 반복 실행
    SELECT ... FROM 임시테이블이름 WHERE ...
)
SELECT * FROM 임시테이블이름;

3. 재귀 쿼리 예시: 조직도 조회

예를 들어, 각 직원이 자신의 상사의 ID를 가지고 있는 직원 테이블이 있다고 가정해 보겠습니다. 이 테이블을 사용하여 특정 직원으로부터 시작하여 모든 하위 직원을 조회하는 재귀 쿼리를 작성할 수 있습니다.

WITH RECURSIVE Subordinates AS (
    SELECT employee_id, name, manager_id
    FROM employees
    WHERE name = '홍길동' -- 시작 직원
    UNION ALL
    SELECT e.employee_id, e.name, e.manager_id
    FROM employees e
    INNER JOIN Subordinates s ON s.employee_id = e.manager_id
)
SELECT * FROM Subordinates;

이 쿼리는 '홍길동' 직원부터 시작하여, 그의 모든 하위 직원들을 조회합니다. UNION ALL을 사용하여 초기 쿼리의 결과와 재귀 쿼리의 결과를 합치며, INNER JOIN을 통해 재귀적으로 하위 직원들을 조회합니다.

4. 주의사항

  • 재귀 쿼리는 무한 루프에 빠질 위험이 있으므로, 적절한 종료 조건을 설정하는 것이 중요합니다.
  • MySQL에서는 MAX_RECURSION_DEPTH 옵션을 통해 재귀 깊이를 제한할 수 있습니다. 필요에 따라 이 값을 조정해야 할 수도 있습니다.

재귀 쿼리는 복잡한 계층형 데이터를 다룰 때 매우 강력한 도구가 될 수 있습니다.

5. 참고 자료

[1] velog - [MySQL] 재귀 쿼리

https://velog.io/@hyobbang/MySQL-%EC%9E%AC%EA%B7%80-%EC%BF%BC%EB%A6%AC

 

[MySQL] 재귀 쿼리

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

velog.io

 

[2] 티스토리 - [MySQL] WITH RECURSIVE | 임의 테이블 사용하기 | 재귀 쿼리

https://seen-young.tistory.com/26

 

[MySQL] WITH RECURSIVE | 임의 테이블 사용하기 | 재귀 쿼리

Programmers SQL 고득점 Kit 에서 WITH RECURSIVE를 사용하여 임의의 테이블을 생성하고 Join하여 풀이해야하는 문제를 만났습니다 처음 마주하는 문법이었고, 정리하기 위해 글 작성하게 되었습니다. WITH

seen-young.tistory.com

 

[3] 프로그래머스 스쿨 - MYSQL 재귀 쿼리 사용

https://school.programmers.co.kr/questions/52918

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[4] velog - [SQL] MySQL 재귀 쿼리 (with recursive)

https://velog.io/@nayu1105/SQL-%EC%9E%AC%EA%B7%80-%EC%BF%BC%EB%A6%AC

 

[SQL] MySQL 재귀 쿼리 (with recursive)

최근 재귀 함수에 대해 배우면서 브래드 크럼스 구현을 하게 되었다.우연히 내가 현재 SQLD 준비 중이라, 계층 구조와 재귀 쿼리에 대해 알고 있었고 이를 활용하여 문제를 풀었다.브래드 크럼스

velog.io

 

6. 관련 문제

프로그래머스 - LEVEL5 멸종위기의대장균찾기

https://school.programmers.co.kr/learn/courses/30/lessons/301651

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

728x90

'공부 > MySQL' 카테고리의 다른 글

[MySQL] WITH  (0) 2024.04.23
[MySQL] UNION ALL과 JOIN  (0) 2024.04.13
[MySQL] 셀프조인  (0) 2024.04.12