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

MySQL에서 ORDER BY 컬럼명*1을 사용하는 목적은 무엇일까?

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 이상에서는 함수 기반 인덱스를 활용하면 성능 저하 없이 정렬할 수 있습니다.