MySQL에서 데이터를 오름차순으로 정렬할 때, 값이 0인 레코드는 자연스럽게 가장 앞쪽에 위치하게 됩니다. 하지만 실무에서는 0이나 NULL 같은 특수한 값을 정렬 결과의 맨 마지막으로 보내고 싶은 경우가 많습니다. 이 글에서는 ORDER BY 절을 활용해 오름차순 정렬 순서를 그대로 유지하면서 0을 결과의 끝으로 배치하는 방법을 알아보겠습니다.
1. 테스트용 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Number int
-> );
Query OK, 0 rows affected (0.58 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 여러 개의 레코드를 추가합니다. 여기에는 정렬 순서를 확인하기 위한 값 0도 포함되어 있습니다.
mysql> insert into DemoTable values(9);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(4);
Query OK, 1 row affected (0.31 sec)
mysql> insert into DemoTable values(0);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(7);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(11);
Query OK, 1 row affected (0.12 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
출력 결과
+--------+
| Number |
+--------+
| 9 |
| 4 |
| 0 |
| 7 |
| 11 |
+--------+
5 rows in set (0.00 sec)
4. 0을 맨 뒤로 보내면서 오름차순 정렬하기
핵심은 ORDER BY 절에 두 개의 조건을 함께 사용하는 것입니다. 다음 쿼리를 살펴보세요.
mysql> select *from DemoTable order by Number=0,Number;
출력 결과
+--------+
| Number |
+--------+
| 4 |
| 7 |
| 9 |
| 11 |
| 0 |
+--------+
5 rows in set (0.00 sec)
동작 원리 설명
이 쿼리가 의도대로 작동하는 이유는 MySQL에서 비교 표현식이 불리언 값으로 평가되기 때문입니다.
- 첫 번째 정렬 기준 (
Number=0): 각 행에 대해 이 표현식은 값이 0이면1(참), 0이 아니면0(거짓)을 반환합니다. MySQL은 오름차순 정렬 시 거짓(0)을 참(1)보다 먼저 배치하므로, 0이 아닌 값들이 모두 앞쪽에 오고 값이 0인 행만 맨 뒤로 밀려납니다. - 두 번째 정렬 기준 (
Number): 첫 번째 기준으로 그룹화된 행들 내부에서 실제 숫자 값을 기준으로 오름차순 정렬이 수행됩니다.
결과적으로 4, 7, 9, 11이 오름차순으로 정렬된 후, 0이 가장 마지막에 배치되는 것을 확인할 수 있습니다. 이 기법은 별도의 CASE 문 없이 간결하게 원하는 정렬 순서를 구현할 수 있어 실무에서 매우 유용하게 활용됩니다.