MySQL에서 ORDER BY 컬럼명*1의 목적
MySQL에서 ORDER BY 컬럼명*1을 사용하면 해당 컬럼의 값이 숫자로 암묵적으로(Implicitly) 형변환됩니다. 즉, VARCHAR처럼 문자열 타입으로 저장된 숫자 데이터도 실제 숫자 값 기준으로 정렬할 수 있게 됩니다.
기본 문법은 다음과 같습니다.
select * from yourTableName
order by yourColumnName*1;
예제 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1441
-> (
-> Id varchar(30)
-> );
Query OK, 0 rows affected (0.53 sec)
레코드 삽입
insert 문을 사용하여 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable1441 values('301');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1441 values('23');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1441 values('345');
Query OK, 1 row affected (0.42 sec)
mysql> insert into DemoTable1441 values('10');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1441 values('38');
Query OK, 1 row affected (0.11 sec)저장된 레코드 확인
select 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1441;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 301 |
| 23 |
| 345 |
| 10 |
| 38 |
+------+
5 rows in set (0.00 sec)
ORDER BY id*1 적용하기
다음은 order by id*1을 활용한 쿼리입니다.
mysql> select * from DemoTable1441
-> order by id*1;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 10 |
| 23 |
| 38 |
| 301 |
| 345 |
+------+
5 rows in set (0.00 sec)
왜 이런 결과가 나올까?
Id 컬럼은 VARCHAR 타입이므로, 단순히 ORDER BY id만 실행하면 문자열 비교 방식(사전식 순서)으로 정렬되어 '10', '23', '301', '345', '38' 순서가 됩니다. 반면 *1을 곱해주면 MySQL이 각 값을 숫자로 암묵적으로 변환하기 때문에 10 → 23 → 38 → 301 → 345처럼 우리가 기대하는 올바른 숫자 순서대로 정렬됩니다.
참고로, 이와 같은 목적에는 CAST(id AS UNSIGNED)나 id+0을 사용하는 방법도 있으며, MySQL 8.0 이상에서는 함수 기반 인덱스를 활용하면 성능 저하 없이 정렬할 수 있습니다.