MySQL에서는 사용자 정의 변수와 PREPARE 문을 조합하면 ORDER BY 절에 동적인 값을 적용할 수 있습니다. 이번 글에서는 숫자형 사용자 정의 변수를 활용해 쿼리를 동적으로 구성하고 실행하는 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1898
(
Number int
);
Query OK, 0 rows affected (0.00 sec)2. 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1898 values(10); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1898 values(70); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1898 values(30); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1898 values(50); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1898 values(40); Query OK, 1 row affected (0.00 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1898;
실행 결과는 다음과 같습니다.
+--------+ | Number | +--------+ | 10 | | 70 | | 30 | | 50 | | 40 | +--------+ 5 rows in set (0.00 sec)
현재 데이터는 입력된 순서 그대로 저장되어 있으며, 아직 정렬되지 않은 상태입니다.
4. 사용자 정의 변수로 ORDER BY 쿼리 만들기
이제 숫자형 사용자 정의 변수를 선언하고, CONCAT 함수로 이를 포함한 쿼리 문자열을 만든 뒤 PREPARE 문으로 실행합니다.
mysql> set @limitValue:=1;
Query OK, 0 rows affected (0.00 sec)
mysql> set @query:=CONCAT('select * from DemoTable1898 order by ',@limitValue);
Query OK, 0 rows affected (0.00 sec)
mysql> prepare stmt from @query;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute stmt;위 쿼리를 실행하면 다음과 같이 Number 컬럼 기준으로 오름차순 정렬된 결과를 확인할 수 있습니다.
+--------+ | Number | +--------+ | 10 | | 30 | | 40 | | 50 | | 70 | +--------+ 5 rows in set (0.00 sec)
5. 준비된 문(Prepared Statement) 해제하기
사용이 끝난 준비된 문은 DEALLOCATE PREPARE 문으로 해제하여 리소스를 정리하는 것이 좋습니다.
mysql> deallocate prepare stmt; Query OK, 0 rows affected (0.00 sec)
정리
이처럼 사용자 정의 변수(@변수)에 값을 담고, CONCAT으로 쿼리 문자열을 동적으로 조립한 후 PREPARE와 EXECUTE로 실행하면 ORDER BY 절의 기준값을 유연하게 변경할 수 있습니다. 이 기법은 정렬 기준이나 조건이 상황에 따라 달라지는 동적 쿼리를 작성할 때 특히 유용하며, 사용 후에는 반드시 DEALLOCATE PREPARE로 해제하는 습관을 들이면 좋습니다.