MySQL에서 숫자 값이 VARCHAR 타입으로 저장되어 있으면, 단순히 ORDER BY를 사용할 때 사전식(문자열) 순서로 정렬됩니다. 이 경우 컬럼명 뒤에 +0을 붙여주면 값을 숫자로 변환해 올바르게 정렬할 수 있습니다.
기본 문법
SELECT yourColumnName FROM yourTableName ORDER BY yourColumnName + 0 DESC;
위 문법이 실제로 어떻게 동작하는지 예제를 통해 살펴보겠습니다.
테스트 테이블 생성하기
먼저 테이블을 생성하는 쿼리입니다.
mysql> create table selectOrderdemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(100),
-> RankNumber varchar(100)
-> );
Query OK, 0 rows affected (0.55 sec)데이터 삽입하기
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into selectOrderdemo(Name,RankNumber) values('Larry',-100);
Query OK, 1 row affected (0.23 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('John',50);
Query OK, 1 row affected (0.13 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('Bob',0);
Query OK, 1 row affected (0.14 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('Carol',-110);
Query OK, 1 row affected (0.23 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('David',98);
Query OK, 1 row affected (0.21 sec)저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from selectOrderdemo;
실행 결과는 다음과 같습니다.
+----+-------+------------+ | Id | Name | RankNumber | +----+-------+------------+ | 1 | Larry | -100 | | 2 | John | 50 | | 3 | Bob | 0 | | 4 | Carol | -110 | | 5 | David | 98 | +----+-------+------------+ 5 rows in set (0.00 sec)
RankNumber는 VARCHAR 타입이므로, 일반적인 ORDER BY만 사용하면 문자열 기준으로 정렬됩니다. 아래에서 +0을 활용해 숫자처럼 정렬하는 방법을 케이스별로 확인해 보겠습니다.
숫자처럼 정렬하는 쿼리
케이스 1: 내림차순 정렬
결과를 큰 수부터 작은 수 순으로 정렬하려면 다음 쿼리를 사용합니다.
mysql> select RankNumber FROM selectOrderdemo ORDER BY RankNumber+0 DESC;
실행 결과입니다.
+------------+ | RankNumber | +------------+ | 98 | | 50 | | 0 | | -100 | | -110 | +------------+ 5 rows in set (0.00 sec)
케이스 2: 오름차순 정렬
결과를 작은 수부터 큰 수 순으로 정렬하려면 다음 쿼리를 사용합니다.
mysql> select RankNumber FROM selectOrderdemo ORDER BY RankNumber+0;
실행 결과입니다.
+------------+ | RankNumber | +------------+ | -110 | | -100 | | 0 | | 50 | | 98 | +------------+ 5 rows in set (0.00 sec)
케이스 3: 전체 컬럼 조회 및 정렬
테이블의 모든 컬럼을 숫자 순서대로 정렬해서 가져오려면 아래 쿼리를 사용합니다.
mysql> select * FROM selectOrderdemo ORDER BY RankNumber+0 DESC;
실행 결과입니다.
+----+-------+------------+ | Id | Name | RankNumber | +----+-------+------------+ | 5 | David | 98 | | 2 | John | 50 | | 3 | Bob | 0 | | 1 | Larry | -100 | | 4 | Carol | -110 | +----+-------+------------+ 5 rows in set (0.00 sec)
정리
VARCHAR 타입 컬럼에 저장된 숫자를 정렬할 때는 ORDER BY 컬럼명 + 0처럼 +0을 붙이면 MySQL이 해당 값을 암시적으로 숫자로 변환하여 올바른 숫자 순서대로 정렬해 줍니다. 다만 이런 방식은 인덱스를 활용하지 못해 대용량 테이블에서 성능 저하가 발생할 수 있으므로, 가능하다면 처음부터 숫자 타입(INT, DECIMAL 등)으로 컬럼을 설계하는 것이 좋습니다.