개요
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 값의 정렬 위치를 자유롭게 제어할 수 있어, 실무에서 점수 목록이나 우선순위 데이터를 처리할 때 매우 유용합니다.