NULL 값을 먼저 표시하면서 내림차순 정렬하기
MySQL에서 특정 컬럼을 기준으로 내림차순(DESC) 정렬하되, NULL 값이 있는 행을 가장 앞쪽에 배치하고 싶다면 IS NULL 연산자를 활용하면 됩니다. MySQL은 기본적으로 오름차순 정렬 시 NULL을 가장 먼저, 내림차순 정렬 시에는 NULL을 가장 마지막에 배치하기 때문에, 별도의 처리 없이는 원하는 결과를 얻기 어렵습니다.
이때 사용할 수 있는 기본 구문은 다음과 같습니다.
SELECT yourColumnName
FROM yourTableName
ORDER BY yourColumnName IS NULL DESC, yourColumnName DESC;
동작 원리
yourColumnName IS NULL 표현식은 해당 값이 NULL이면 1, NULL이 아니면 0을 반환합니다. 이 결과값을 기준으로 내림차순 정렬하면 NULL(1)이 일반 값(0)보다 앞에 위치하게 되고, 두 번째 정렬 조건인 yourColumnName DESC가 실제 데이터를 내림차순으로 정렬해 줍니다.
예제 테이블 생성
먼저 예제로 사용할 테이블을 생성합니다.
mysql> CREATE TABLE OrderByNullFirstDemo (
-> StudentId INT
-> );
Query OK, 0 rows affected (0.56 sec)
INSERT 명령어로 몇 개의 레코드를 삽입합니다.
mysql> INSERT INTO OrderByNullFirstDemo VALUES(100);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO OrderByNullFirstDemo VALUES(200);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO OrderByNullFirstDemo VALUES(150);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO OrderByNullFirstDemo VALUES(NULL);
Query OK, 1 row affected (0.15 sec)
SELECT 문으로 저장된 전체 레코드를 확인합니다.
mysql> SELECT * FROM OrderByNullFirstDemo;
실행 결과는 다음과 같습니다.
+-----------+
| StudentId |
+-----------+
| 100 |
| 200 |
| 150 |
| NULL |
+-----------+
4 rows in set (0.00 sec)
NULL을 먼저 표시하는 내림차순 정렬 실행
앞서 설명한 구문을 적용하여 NULL 값을 가장 먼저 표시하면서 나머지 데이터를 내림차순으로 정렬해 보겠습니다.
mysql> SELECT StudentId
-> FROM OrderByNullFirstDemo
-> ORDER BY StudentId IS NULL DESC, StudentId DESC;
실행 결과는 다음과 같습니다.
+-----------+
| StudentId |
+-----------+
| NULL |
| 200 |
| 150 |
| 100 |
+-----------+
4 rows in set (0.00 sec)
결과를 보면 NULL 값이 가장 먼저 출력되고, 그 뒤로 200, 150, 100 순서대로 내림차순 정렬된 것을 확인할 수 있습니다.
참고 사항
일부 자료에서는 GROUP BY ... IS NULL DESC 형태의 쿼리를 소개하기도 하지만, GROUP BY는 본래 집계(grouping)를 위한 절이므로 정렬 목적이라면 ORDER BY를 사용하는 것이 표준적이며 불필요한 경고(warning)도 발생하지 않습니다. 상황에 따라 IF(yourColumnName IS NULL, 0, 1) 또는 CASE WHEN 표현식을 활용해 NULL의 우선순위를 제어하는 방법도 유용하게 사용할 수 있습니다.