MySQL 재귀 SELECT 쿼리란?
MySQL에서는 세션 변수(@변수)와 JOIN을 조합하여 재귀적인 SELECT 쿼리를 구현할 수 있습니다. 이번 글에서는 실제 예제를 통해 재귀 SELECT가 어떻게 동작하는지 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 CREATE 명령어를 사용하여 테이블을 생성합니다.
mysql> CREATE table tblSelectDemo
-> (
-> id int,
-> name varchar(100)
-> );
Query OK, 0 rows affected (0.61 sec)
'id'와 'name' 두 개의 컬럼을 가진 'tblSelectDemo' 테이블이 성공적으로 만들어졌습니다.
2단계: 레코드 삽입
이제 INSERT 문을 사용하여 'tblSelectDemo' 테이블에 샘플 데이터를 입력합니다.
mysql> insert into tblSelectDemo values(1,'John');
Query OK, 1 row affected (0.10 sec)
mysql> insert into tblSelectDemo values(2,'Carol');
Query OK, 1 row affected (0.09 sec)
mysql> insert into tblSelectDemo values(3,'Smith');
Query OK, 1 row affected (0.17 sec)
mysql> insert into tblSelectDemo values(4,'David');
Query OK, 1 row affected (0.15 sec)
mysql> insert into tblSelectDemo values(5,'Bob');
Query OK, 1 row affected (0.18 sec)
3단계: 전체 레코드 확인
테이블에 저장된 모든 레코드를 조회하려면 다음과 같이 SELECT 문을 실행합니다.
mysql> SELECT *from tblSelectDemo;
실행 결과는 다음과 같습니다.
+------+-------+
| id | name |
+------+-------+
| 1 | John |
| 2 | Carol |
| 3 | Smith |
| 4 | David |
| 5 | Bob |
+------+-------+
6 rows in set (0.00 sec)
4단계: 재귀 SELECT 쿼리 작성
재귀 SELECT의 기본 구문은 다음과 같습니다.
mysql> SELECT var1.id as id, @sessionName:= var1.Name as NameofStudent
-> from (select * from tblSelectDemo order by id desc) var1
-> join
-> (select @sessionName:= 4)tmp
-> where var1.id = @sessionName;
실행 결과는 다음과 같습니다.
+------+----------------+
| id | NameofStudent |
+------+----------------+
| 4 | David |
+------+----------------+
1 row in set (0.00 sec)
재귀 SELECT 쿼리의 동작 원리
위 쿼리가 어떻게 동작하는지 핵심 요소를 살펴보겠습니다.
- 세션 변수 초기화:
(select @sessionName:= 4)tmp서브쿼리는 세션 변수 '@sessionName'을 값 4로 초기화합니다. 이 값이 재귀 탐색의 시작점이 됩니다. - 정렬된 파생 테이블:
(select * from tblSelectDemo order by id desc) var1은 id를 내림차순으로 정렬한 파생 테이블을 생성하여, 재귀적으로 행을 순회할 기준을 제공합니다. - 변수 갱신과 조건 비교: WHERE 절에서
var1.id = @sessionName조건으로 현재 행을 선택하고, SELECT 절의@sessionName:= var1.Name이 변수 값을 갱신하면서 다음 반복의 기준값을 설정합니다.
이러한 방식으로 세션 변수의 값을 순차적으로 갱신해가며 원하는 결과를 얻을 수 있습니다.
참고: MySQL 8.0 이상에서는 CTE 활용 권장
세션 변수를 이용한 방식은 MySQL 5.x 버전에서 널리 사용되었지만, MySQL 8.0부터는 WITH RECURSIVE 공통 테이블 표현식(CTE)을 지원하므로 계층형 데이터나 반복 조회에는 CTE를 사용하는 것이 더 안전하고 가독성이 좋습니다. 버전 업그레이드가 가능하다면 CTE 기반의 재귀 쿼리 작성을 권장합니다.