MySQL에서 ORDER BY ASC(오름차순)로 데이터를 정렬하면 기본적으로 NULL 값이 목록의 가장 앞쪽에 표시됩니다. 하지만 실무에서는 NULL 값을 목록 맨 아래로 보내야 하는 경우가 많습니다. 이럴 때 CASE 문과 ORDER BY를 함께 사용하면 원하는 정렬 결과를 손쉽게 얻을 수 있습니다.
1. 예제 테이블 생성
먼저 테스트용 테이블을 생성합니다.
mysql> create table DemoTable1937
(
Name varchar(20)
);
Query OK, 0 rows affected (0.00 sec)2. 샘플 데이터 삽입
insert 명령어를 사용해 레코드를 삽입합니다. 일반 문자열 외에 NULL 값과 빈 문자열('')도 함께 넣어 다양한 경우를 확인해 보겠습니다.
mysql> insert into DemoTable1937 values('Chris');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values(NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('Adam');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('John');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values(NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('Bob');
Query OK, 1 row affected (0.00 sec)3. 전체 레코드 조회
select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1937;
실행 결과는 다음과 같습니다.
+-------+ | Name | +-------+ | Chris | | NULL | | Adam | | John | | | | NULL | | Bob | +-------+ 7 rows in set (0.00 sec)
4. NULL 값을 맨 아래로 정렬하는 쿼리
다음은 오름차순(ASC) 정렬을 유지하면서 NULL 값을 맨 아래에 배치하는 쿼리입니다.
mysql> select * from DemoTable1937
order by case when Name IS NULL then 100
when Name='' then 101
else 103
end desc
,
Name asc;실행 결과는 다음과 같습니다.
+-------+ | Name | +-------+ | Adam | | Bob | | Chris | | John | | | | NULL | | NULL | +-------+ 7 rows in set (0.00 sec)
5. 쿼리 동작 원리
CASE 문은 각 행에 우선순위 숫자를 부여하는 역할을 합니다.
Name이 NULL이면 100Name이 빈 문자열('')이면 101- 그 외의 일반 값이면 103
이 우선순위 값을 내림차순(DESC)으로 정렬하면 103 → 101 → 100 순서가 되어, 일반 값이 먼저 출력되고 빈 문자열과 NULL은 뒤로 밀려납니다. 이후 두 번째 정렬 조건인 Name asc가 각 그룹 내에서 이름을 알파벳 순으로 정렬해 줍니다.
그 결과 Adam, Bob, Chris, John처럼 일반 값이 오름차순으로 정렬되고, 그 아래 빈 문자열, 마지막에 NULL 값들이 배치됩니다. 이 패턴은 게시판 목록이나 드롭다운 옵션처럼 비어 있는 데이터를 항상 마지막에 보여줘야 하는 화면에서 특히 유용하게 활용할 수 있습니다.