MySQL에서 0을 제외한 정수 정렬하기
데이터베이스 작업 중에는 숫자 값을 정렬하되, 값이 0인 행은 맨 뒤로 보내고 나머지 정수만 오름차순 또는 내림차순으로 정렬해야 하는 경우가 종종 있습니다. MySQL에서는 ORDER BY 절에 간단한 조건식을 함께 사용하면 이를 손쉽게 구현할 수 있습니다.
기본 문법
값 0을 제외하고 정수를 재정렬하려면 아래 문법을 사용하세요.
select *from yourTableName order by yourColumnName=0 ,yourColumnName;
여기서 yourColumnName = 0이라는 표현식은 열의 값이 0이면 1을, 0이 아니면 0을 반환합니다. MySQL은 기본적으로 오름차순(ASC)으로 정렬하기 때문에, 조건 결과가 0인 즉 0이 아닌 값들이 먼저 정렬되고, 그 뒤에 0인 값들이 배치됩니다.
예제 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table reorderIntegerExcept0 -> ( -> value int -> ); Query OK, 0 rows affected (0.70 sec)
데이터 삽입
다음은 insert 명령을 사용해 테이블에 레코드를 삽입하는 쿼리입니다.
mysql> insert into reorderIntegerExcept0 values(90); Query OK, 1 row affected (0.17 sec) mysql> insert into reorderIntegerExcept0 values(10); Query OK, 1 row affected (0.21 sec) mysql> insert into reorderIntegerExcept0 values(0); Query OK, 1 row affected (0.18 sec) mysql> insert into reorderIntegerExcept0 values(40); Query OK, 1 row affected (0.18 sec) mysql> insert into reorderIntegerExcept0 values(0); Query OK, 1 row affected (0.09 sec) mysql> insert into reorderIntegerExcept0 values(50); Query OK, 1 row affected (0.17 sec) mysql> insert into reorderIntegerExcept0 values(80); Query OK, 1 row affected (0.13 sec) mysql> insert into reorderIntegerExcept0 values(0); Query OK, 1 row affected (0.10 sec) mysql> insert into reorderIntegerExcept0 values(300); Query OK, 1 row affected (0.20 sec)
전체 레코드 조회
select 문을 사용해 테이블의 모든 레코드를 조회하는 쿼리는 다음과 같습니다.
mysql> select * from reorderIntegerExcept0;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+ | value | +-------+ | 90 | | 10 | | 0 | | 40 | | 0 | | 50 | | 80 | | 0 | | 300 | +-------+ 9 rows in set (0.00 sec)
현재 데이터에는 0이 세 개 포함되어 있으며, 값들이 입력된 순서 그대로 저장되어 있는 것을 확인할 수 있습니다.
0을 제외한 오름차순 정렬
이제 값 0을 제외하고 정수를 재정렬하는 쿼리입니다.
mysql> select * from reorderIntegerExcept0 order by value =0 ,value;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+ | value | +-------+ | 10 | | 40 | | 50 | | 80 | | 90 | | 300 | | 0 | | 0 | | 0 | +-------+ 9 rows in set (0.00 sec)
실행 결과를 보면 0이 아닌 값들이 10, 40, 50, 80, 90, 300 순으로 오름차순 정렬되고, 0인 값들은 모두 맨 뒤로 이동한 것을 확인할 수 있습니다.
0을 제외한 내림차순 정렬
0을 제외한 정수를 내림차순으로 정렬하고 싶다면 아래 쿼리처럼 두 번째 정렬 기준에 DESC를 추가하면 됩니다.
mysql> select * from reorderIntegerExcept0 order by value =0,value DESC;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+ | value | +-------+ | 300 | | 90 | | 80 | | 50 | | 40 | | 10 | | 0 | | 0 | | 0 | +-------+ 9 rows in set (0.00 sec)
마무리
이처럼 ORDER BY 열명 = 0 형태의 조건식을 활용하면 서브쿼리나 CASE 문 없이도 0인 값을 맨 뒤로 보내면서 나머지 값을 원하는 순서대로 정렬할 수 있습니다. NULL 값을 처리할 때 자주 쓰이는 IS NULL 조건과 같은 원리로, 실무에서 유용하게 활용되는 정렬 기법이니 꼭 기억해 두시기 바랍니다.