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

MySQL에서 0인 행은 맨 뒤로 보내고 0보다 큰 값으로 정렬하는 방법

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)와 같은 표현식을 추가로 활용할 수 있습니다.