SQL#재귀쿼리

codataffee·2024년 5월 1일
0

SQL

목록 보기
8/19
post-thumbnail

#재귀쿼리


#재귀쿼리란?

재귀쿼리에 대해 작성하기 전,
MySQL에서 메모리 상에 가상 테이블을 생성하는 쿼리인
WITH 절에 대한 이해가 필요했다.

  • WITH 절은 CTEs(Common Table Expressions)를 표현하는 구문으로,
    CTEs는 기존의 뷰, 파생 테이블, 임시 테이블 등으로 사용되던 것들을 대신할 수 있고, 간결한 식으로 표현할 수 있는 장점이 있다.

  • CTEs는 재귀적CTE 와 비재귀적CTE 이렇게 두 가지 종류가 있는데,
    오늘 작성해볼 것은 재귀적CTE에 대한 내용이다.

  • 재귀적?
    재귀는 자기 자신을 반복적으로 불러온다는 의미로 이해하면 쉽다.


#재귀적 CTE

  • 프로그래밍에서의 반복문과 비슷한 기법으로,
    SQL에서는 재귀 쿼리 기법을 활용한다.
  • 한 마디로 정리하면,
    WITH RECURSIVE문 내부에 UNION을 활용해 재귀를 구성한다.
WITH RECURSIVE 테이블명 AS 
	(
    SELECT 1 AS n       - # Non-Recursive 문장
                          (비재귀: 첫 루프만 실행)
    UNION ALL           - # 비재귀 행과 수직 결합
    
    SELECT n + 1 AS num - # Recursive 문장
    FROM 테이블명          (실행마다 행의 위치가 기억되어 다음 행으로 이동)
    WHERE n < 10        - # 정지조건 (조건 내 n회 반복)
	)

SELECT * FROM test;
  1. 메모리에 가상의 테이블을 저장
  2. 비재귀 쿼리가 반드시 필요
  3. UNION 을 사용해 비재귀 행과 재귀 행을 수직 결합
  4. 반복되는 Recursive 문장에는 반드시 정지조건 설정
  5. 재귀 쿼리에는 가상의 테이블을 참조하는 문장으로 작성
  6. 가상의 테이블을 구성, 그 자신(가상의 테이블)을 참조하여 값을 결정


#PRACTICE

  • 24시간을 표현하는 시간 테이블 생성

WITH RECURSIVE TEST AS 
  (
  SELECT 0 AS HOUR # 비재귀
  
  UNION ALL

  SELECT HOUR + 1  # 재귀
  FROM TEST 
  WHERE HOUR < 23  # 재귀 정지 조건
  )

SELECT * FROM TEST

  • 입양 시각 구하기



profile
커피 좋아하는 데이터 꿈나무

0개의 댓글

관련 채용 정보