MySQL 8.0 이전 버전에는 ROW_NUMBER() 윈도우 함수가 기본적으로 제공되지 않습니다. 하지만 사용자 정의 변수(user-defined variable)를 활용하면 동일한 효과를 손쉽게 얻을 수 있습니다. 아래에서 문법과 실제 예제를 통해 그 방법을 자세히 살펴보겠습니다.
사용자 변수로 ROW_NUMBER 흉내 내기
핵심 원리는 간단합니다. 조회 시마다 변수 값을 1씩 증가시켜 각 행에 순차적인 번호를 부여하는 방식입니다. 기본 문법은 다음과 같습니다.
SELECT (@yourVariableName:=@yourVariableName + 1) AS `anyAliasName`, yourColumnName1, yourColumnName2, ...N FROM yourTableName, (SELECT @yourVariableName:=0) AS anyAliasName;
여기서 (SELECT @yourVariableName:=0) 부분은 크로스 조인(cross join)을 통해 변수를 0으로 초기화하는 역할을 합니다. 이렇게 하면 첫 번째 행부터 1번이 차례대로 매겨집니다.
예제 테이블 생성하기
문법을 제대로 이해하기 위해 먼저 테스트용 테이블을 만들어 보겠습니다.
mysql> create table RowNumberDemo -> ( -> UserId int, -> UserName varchar(20) -> ); Query OK, 0 rows affected (0.74 sec)
샘플 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into RowNumberDemo values(10,'John'); Query OK, 1 row affected (0.14 sec) mysql> insert into RowNumberDemo values(50,'Carol'); Query OK, 1 row affected (0.20 sec) mysql> insert into RowNumberDemo values(100,'Sam'); Query OK, 1 row affected (0.20 sec) mysql> insert into RowNumberDemo values(150,'Mike'); Query OK, 1 row affected (0.54 sec) mysql> insert into RowNumberDemo values(210,'Bob'); Query OK, 1 row affected (0.58 sec)
저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from RowNumberDemo;
실행 결과는 다음과 같습니다.
+--------+----------+ | UserId | UserName | +--------+----------+ | 10 | John | | 50 | Carol | | 100 | Sam | | 150 | Mike | | 210 | Bob | +--------+----------+ 5 rows in set (0.00 sec)
ROW_NUMBER()와 동일한 결과 얻기
이제 앞서 설명한 변수 기법을 적용해 각 행에 순번을 부여하는 쿼리를 실행해 보겠습니다.
mysql> SELECT -> (@ROW_NUMBER:=@ROW_NUMBER + 1) AS `ROW_NUMBER`, -> UserId, UserName -> FROM -> RowNumberDemo, (SELECT @ROW_NUMBER:=0) AS t;
실행 결과, 각 행에 1부터 시작하는 연속된 번호가 부여된 것을 확인할 수 있습니다.
+------------+--------+----------+ | ROW_NUMBER | UserId | UserName | +------------+--------+----------+ | 1 | 10 | John | | 2 | 50 | Carol | | 3 | 100 | Sam | | 4 | 150 | Mike | | 5 | 210 | Bob | +------------+--------+----------+ 5 rows in set (0.03 sec)
참고: MySQL 8.0 이상이라면
MySQL 8.0부터는 표준 SQL 윈도우 함수인 ROW_NUMBER() OVER (ORDER BY 컬럼명)을 공식적으로 지원합니다. 따라서 최신 버전을 사용 중이라면 별도의 변수 처리 없이 윈도우 함수를 직접 사용하는 것이 성능과 가독성 면에서 더 권장됩니다. 위의 변수 기법은 주로 MySQL 5.x 등 하위 버전 환경에서 유용하게 활용할 수 있습니다.