MySQL에서 데이터를 정렬할 때 NULL 값이 포함된 컬럼을 다뤄야 하는 경우가 자주 있습니다. 이 글에서는 IS NULL 연산자와 ORDER BY 절을 활용해 NULL 값을 원하는 위치(맨 앞 또는 맨 뒤)로 정렬하는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable707 (
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName varchar(100),
StudentMarks int
);
Query OK, 0 rows affected (0.59 sec)2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 일부러 NULL 값이 포함된 레코드를 여러 개 추가합니다.
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('John',45);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values(NULL,65);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('Chris',78);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values(NULL,89);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('Robert',99);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values(NULL,34);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable707(StudentFirstName,StudentMarks) values('Mike',43);
Query OK, 1 row affected (0.20 sec)3. 전체 데이터 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable707;
실행 결과는 다음과 같습니다.
+-----------+------------------+--------------+ | StudentId | StudentFirstName | StudentMarks | +-----------+------------------+--------------+ | 1 | John | 45 | | 2 | NULL | 65 | | 3 | Chris | 78 | | 4 | NULL | 89 | | 5 | Robert | 99 | | 6 | NULL | 34 | | 7 | Mike | 43 | +-----------+------------------+--------------+ 7 rows in set (0.00 sec)
4. NULL 값을 정렬하는 핵심 쿼리
이제 IS NULL 조건을 활용해 NULL 값을 맨 뒤로 밀어내고, 나머지 값들은 내림차순으로 정렬하는 쿼리를 실행합니다.
mysql> select *from DemoTable707 order by StudentFirstName IS NULL, StudentFirstName DESC;
실행 결과는 다음과 같습니다.
+-----------+------------------+--------------+ | StudentId | StudentFirstName | StudentMarks | +-----------+------------------+--------------+ | 5 | Robert | 99 | | 7 | Mike | 43 | | 1 | John | 45 | | 3 | Chris | 78 | | 2 | NULL | 65 | | 4 | NULL | 89 | | 6 | NULL | 34 | +-----------+------------------+--------------+ 7 rows in set (0.00 sec)
5. 쿼리 동작 원리
위 쿼리가 어떻게 작동하는지 살펴보겠습니다.
StudentFirstName IS NULL: 해당 컬럼이 NULL이면 1, 값이 있으면 0을 반환합니다.- 첫 번째 정렬 기준에서 값이 있는 행(0)이 먼저 오고, NULL 행(1)은 맨 뒤로 밀려납니다.
- 두 번째 정렬 기준인
StudentFirstName DESC는 NULL이 아닌 값들을 알파벳 내림차순(Robert → Mike → John → Chris)으로 정렬합니다.
참고: NULL을 맨 앞으로 정렬하고 싶다면?
반대로 NULL 값을 맨 앞에 배치하려면 DESC를 활용하거나 IS NOT NULL을 사용하면 됩니다.
-- NULL 값을 맨 앞으로 정렬 SELECT * FROM DemoTable707 ORDER BY StudentFirstName IS NOT NULL, StudentFirstName DESC;
마무리
MySQL은 기본적으로 ORDER BY ASC 시 NULL을 가장 작은 값으로 간주해 맨 앞에 배치하고, DESC 시에는 맨 뒤에 배치합니다. 하지만 IS NULL 연산자를 정렬 기준으로 함께 사용하면 NULL 값의 위치를 자유롭게 제어할 수 있습니다. 실무에서 보고서나 목록 화면을 만들 때 유용하게 활용해 보시기 바랍니다.