사용자 정의 변수(User-Defined Variable)란?
MySQL에서 한 필드의 값을 기반으로 다른 필드의 값을 도출하려면 사용자 정의 변수(user-defined variable) 개념을 활용할 수 있습니다. 사용자 정의 변수는 @ 기호로 선언되며, 쿼리가 행을 처리하는 과정에서 값을 누적하거나 참조할 수 있어 누적 합계(cumulative sum)를 계산할 때 특히 유용합니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1868
(
Value int
);
Query OK, 0 rows affected (0.00 sec)샘플 데이터 삽입
insert 명령을 사용하여 테이블에 레코드를 몇 개 삽입합니다.
mysql> insert into DemoTable1868 values(10); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1868 values(20); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1868 values(30); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1868 values(40); Query OK, 1 row affected (0.00 sec)
데이터 조회
select 문을 사용하여 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1868;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+ | Value | +-------+ | 10 | | 20 | | 30 | | 40 | +-------+ 4 rows in set (0.00 sec)
필드 값으로부터 새로운 필드 값 도출하기
다음은 MySQL에서 기존 필드(Value)의 값을 이용해 새로운 필드(SecondColumn)의 값을 도출하는 쿼리입니다.
mysql> select Value,(@iterator:=Value+@iterator) as SecondColumn from DemoTable1868,( select @iterator:=0) tbl;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+--------------+ | Value | SecondColumn | +-------+--------------+ | 10 | 10 | | 20 | 30 | | 30 | 60 | | 40 | 100 | +-------+--------------+ 4 rows in set (0.00 sec)
쿼리 동작 원리
이 쿼리의 핵심은 ( select @iterator:=0 ) tbl 부분입니다. 서브쿼리를 통해 변수 @iterator를 0으로 초기화한 뒤, 각 행을 읽을 때마다 @iterator:=Value+@iterator 표현식이 현재 행의 Value 값과 이전까지 누적된 값을 더해 SecondColumn에 저장합니다.
그 결과 SecondColumn에는 10 → 30 → 60 → 100처럼 누적 합계(running total)가 순차적으로 계산되어 출력됩니다. 이러한 기법은 MySQL 8.0 이전 버전에서 윈도우 함수(SUM() OVER()) 없이 누적 합계를 구할 때 널리 사용됩니다. 참고로 MySQL 8.0 이상에서는 가독성과 성능 면에서 윈도우 함수를 사용하는 것이 권장됩니다.