Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 ROW_NUMBER() 구현하기 – 사용자 변수를 활용한 행 번호 매기기

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 등 하위 버전 환경에서 유용하게 활용할 수 있습니다.