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

MySQL에서 NULL 값을 맨 뒤로 보내고 나머지 값은 오름차순으로 정렬하는 방법

개요

MySQL에서 데이터를 정렬할 때 기본적으로 NULL 값은 오름차순 정렬 시 가장 앞쪽에 위치하게 됩니다. 하지만 실무에서는 유효한 값들을 먼저 오름차순으로 보여주고, NULL 값은 목록 맨 뒤에 배치해야 하는 경우가 많습니다.

이럴 때 ORDER BY ISNULL() 함수를 활용하면 간단하게 해결할 수 있습니다. ISNULL() 함수는 해당 값이 NULL이면 1을, NULL이 아니면 0을 반환하기 때문에 이를 정렬 기준의 첫 번째 조건으로 사용하면 NULL이 아닌 행이 먼저 출력됩니다.

예제 테이블 생성

먼저 예제로 사용할 테이블을 생성하겠습니다.

mysql> create table DemoTable669
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentScore int
);
Query OK, 0 rows affected (0.55 sec)

데이터 삽입

insert 명령을 사용하여 일부 레코드를 삽입합니다. 여기서는 의도적으로 NULL 값도 함께 넣었습니다.

mysql> insert into DemoTable669(StudentScore) values(45);
Query OK, 1 row affected (0.80 sec)
mysql> insert into DemoTable669(StudentScore) values(null);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable669(StudentScore) values(89);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable669(StudentScore) values(null);
Query OK, 1 row affected (0.15 sec)

전체 레코드 조회

select 문을 사용하여 테이블의 모든 레코드를 확인해 보겠습니다.

mysql> select *from DemoTable669;

실행 결과는 다음과 같습니다.

+-----------+--------------+
| StudentId | StudentScore |
+-----------+--------------+
| 1         | 45           |
| 2         | NULL         |
| 3         | 89           |
| 4         | NULL         |
+-----------+--------------+
4 rows in set (0.00 sec)

NULL 값을 맨 뒤로 정렬하는 쿼리

다음은 비어 있지 않은 값(유효한 점수)을 오름차순으로 먼저 표시하고, NULL 값은 그 뒤에 출력하는 쿼리입니다.

mysql> select *from DemoTable669
ORDER BY ISNULL(StudentScore), StudentScore;

실행 결과는 다음과 같습니다.

+-----------+--------------+
| StudentId | StudentScore |
+-----------+--------------+
| 1         | 45           |
| 3         | 89           |
| 2         | NULL         |
| 4         | NULL         |
+-----------+--------------+
4 rows in set (0.00 sec)

동작 원리

위 쿼리가 의도대로 작동하는 이유는 다음과 같습니다.

첫 번째 정렬 기준인 ISNULL(StudentScore): 값이 있는 행은 0, NULL인 행은 1을 반환하므로 값이 있는 행이 항상 앞쪽에 배치됩니다.

두 번째 정렬 기준인 StudentScore: 첫 번째 기준으로 묶인 그룹 내에서 점수를 오름차순으로 정렬합니다. 따라서 45가 89보다 먼저 출력되고, NULL 값들은 맨 마지막에 순서대로 표시됩니다.

참고: 대안 방법

ISNULL() 대신 CASE 표현식을 사용해도 동일한 결과를 얻을 수 있습니다.

mysql> select *from DemoTable669
ORDER BY CASE WHEN StudentScore IS NULL THEN 1 ELSE 0 END, StudentScore;

또한 내림차순으로 정렬하면서 NULL을 맨 뒤로 보내고 싶다면 다음과 같이 작성할 수 있습니다.

mysql> select *from DemoTable669
ORDER BY ISNULL(StudentScore), StudentScore DESC;

이처럼 ORDER BY 절에서 ISNULL() 함수를 조합하면 NULL 값의 정렬 위치를 자유롭게 제어할 수 있어, 실무에서 점수 목록이나 우선순위 데이터를 처리할 때 매우 유용합니다.