728x90
[MySQL] 재귀 쿼리(Recursive)
🤔재귀함수?
함수 안에 자신의 함수를 다시 호출하는 함수를 의미한다.
자신의 로직을 내부적으로 반복하다가, 일정한 조건이 만족되면 함수를 이탈하여 결과를 도출한다.
MySQL에서도 재귀 쿼리 기법이 존재하는데, 사용법은 다음과 같다.
WITH RECURSIVE 쿼리문을 작성하고, UNION을 통해 재귀를 구성한다.
WITH RECURSIVE cte AS(
SELECT 1 AS a --재귀 초깃값
UNION ALL
SELECT a + 1 --재귀
FROM cte
WHERE h < 5 --재귀 정지 조건
)
SELECT * FROM cte
a
1
2
3
4
5
예를 들어, 0시부터 23시까지의 시간값이 필요할 때, 다음과 같이 재귀쿼리를 사용할 수있다.
ANIMAL_OUTS테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME
는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
WITH RECURSIVE cte AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUT+1 FROM cte WHERE HOUR<23
)
SELECT HOUR, 0 COUNT
FROM cte
WHERE HOUR NOT IN (SELECT distinct HOUR(DATETIME) FROM ANIMAL_OUTS)
)
UNION
(
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
)
ORDER BY HOUR
여기선 UNOIN을 사용했는데 재귀 쿼리 테이블과 JOIN을 사용해서도 값을 구할 수 있다.
반응형
'💾 Data > SQL' 카테고리의 다른 글
[SQL] COUNT() 함수의 최대값 혹은 최대값을 가지는 값 찾기 (0) | 2023.11.08 |
---|---|
[MySQL] REGEXP (0) | 2023.11.07 |
[MySQL] NULL 처리 (0) | 2023.11.03 |
[SQL] 테이블 생성 (CREATE) (0) | 2023.09.12 |
[SQL] 테이블 변경 (ALTER) (0) | 2023.08.31 |