MySQL에서 데이터를 정렬하다 보면 0인 값은 맨 뒤로 밀어내고, 0보다 큰 값들만 오름차순으로 정렬해야 하는 경우가 종종 있습니다. 단순히 ORDER BY를 사용하면 0이 가장 앞에 위치하게 되는데, 이번 글에서는 이 문제를 간단한 쿼리 한 줄로 해결하는 방법을 알아보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table gettingAndOrderingRowsDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value int
-> );
Query OK, 0 rows affected (1.35 sec)2. 샘플 데이터 삽입
다음으로 INSERT 명령을 사용해 테스트용 레코드를 여러 개 입력합니다. 의도적으로 0인 값도 함께 넣었습니다.
mysql> insert into gettingAndOrderingRowsDemo(Value) values(10); Query OK, 1 row affected (0.33 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(13); Query OK, 1 row affected (0.32 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(0); Query OK, 1 row affected (0.17 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(20); Query OK, 1 row affected (0.26 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(30); Query OK, 1 row affected (0.50 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(60); Query OK, 1 row affected (0.24 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(0); Query OK, 1 row affected (0.28 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(45); Query OK, 1 row affected (0.15 sec) mysql> insert into gettingAndOrderingRowsDemo(Value) values(0); Query OK, 1 row affected (0.69 sec)
3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from gettingAndOrderingRowsDemo;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Value | +----+-------+ | 1 | 10 | | 2 | 13 | | 3 | 0 | | 4 | 20 | | 5 | 30 | | 6 | 60 | | 7 | 0 | | 8 | 45 | | 9 | 0 | +----+-------+ 9 rows in set (0.00 sec)
4. 핵심 해결 방법: ORDER BY Value=0, Value
여기서 핵심 아이디어는 ORDER BY 절에 두 개의 정렬 조건을 사용하는 것입니다.
mysql> select * from gettingAndOrderingRowsDemo -> order by Value=0,Value;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Value | +----+-------+ | 1 | 10 | | 2 | 13 | | 4 | 20 | | 5 | 30 | | 8 | 45 | | 6 | 60 | | 3 | 0 | | 7 | 0 | | 9 | 0 | +----+-------+ 9 rows in set (0.00 sec)
5. 원리 설명
이 쿼리가 동작하는 원리는 다음과 같습니다.
Value=0은 불리언(Boolean) 표현식으로, 값이 0이면 1(true), 0이 아니면 0(false)을 반환합니다.- 첫 번째 정렬 기준인
Value=0을 오름차순으로 정렬하면, 0(false)인 행 즉 0보다 큰 값들이 먼저 출력되고, 그다음 1(true)인 행 즉 값이 0인 행들이 맨 뒤로 밀려납니다. - 두 번째 정렬 기준인
Value는 같은 그룹 내에서 실제 값을 기준으로 오름차순 정렬을 수행합니다.
결과적으로 10, 13, 20, 30, 45, 60처럼 0보다 큰 값들이 오름차순으로 먼저 정렬되고, 0인 행 세 개는 마지막에 모이게 됩니다. 내림차순으로 정렬하고 싶다면 두 번째 조건에 DESC를 붙이면 되며, NULL 값을 처리해야 하는 경우에는 ISNULL(Value)와 같은 표현식을 추가로 활용할 수 있습니다.