재귀 쿼리는 특정 규칙에 따라 반복해서 쿼리를 실행하여 그 결과를 합치는 방식으로, 계층형 데이터나 연결 리스트 등을 처리할 때 유용합니다.
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
[2] 티스토리 - [MySQL] WITH RECURSIVE | 임의 테이블 사용하기 | 재귀 쿼리
https://seen-young.tistory.com/26
[3] 프로그래머스 스쿨 - MYSQL 재귀 쿼리 사용
https://school.programmers.co.kr/questions/52918
[4] velog - [SQL] MySQL 재귀 쿼리 (with recursive)
https://velog.io/@nayu1105/SQL-%EC%9E%AC%EA%B7%80-%EC%BF%BC%EB%A6%AC
6. 관련 문제
프로그래머스 - LEVEL5 멸종위기의대장균찾기
https://school.programmers.co.kr/learn/courses/30/lessons/301651
'공부 > MySQL' 카테고리의 다른 글
[MySQL] 쿼리와 코드의 용어 차이 (0) | 2024.05.19 |
---|---|
[MySQL] where과 having은 언제 사용해야 적절할까? (0) | 2024.05.19 |
[MySQL] WITH (0) | 2024.04.23 |
[MySQL] UNION ALL과 JOIN (0) | 2024.04.13 |
[MySQL] 셀프조인 (0) | 2024.04.12 |