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

MySQL에서 NULL 값 기준으로 정렬하는 방법 – ORDER BY 쿼리 실전 예제

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 값의 위치를 자유롭게 제어할 수 있습니다. 실무에서 보고서나 목록 화면을 만들 때 유용하게 활용해 보시기 바랍니다.