MySQL에서 특정 열을 기준으로 데이터를 정렬하면서 빈 값(NULL 또는 공백)을 가진 레코드를 결과의 맨 끝에 배치하려면 ORDER BY 절과 IS NULL 조건을 함께 활용하면 됩니다.
기본 문법
select *from yourTableName order by if(yourColumName = '' or yourColumName is null,1,0),yourColumnName;
이 문법의 핵심은 IF() 함수입니다. 해당 열의 값이 빈 문자열이거나 NULL이면 1을 반환하고, 그렇지 않으면 0을 반환합니다. 오름차순 정렬에서는 0이 1보다 앞에 오므로, 값이 있는 레코드가 먼저 정렬되고 빈 레코드는 자연스럽게 마지막으로 밀려나게 됩니다.
예제 테이블 생성
문법을 실제로 이해하기 위해 테이블을 하나 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.
mysql> create table emptyCellsAtEnd -> ( -> ProductId varchar(100) -> ); Query OK, 0 rows affected (0.65 sec)
샘플 데이터 삽입
이제 INSERT 명령으로 몇 개의 레코드를 삽입합니다. 이 중 일부는 의도적으로 빈 값을 넣었습니다.
mysql> insert into emptyCellsAtEnd values('');
Query OK, 1 row affected (0.23 sec)
mysql> insert into emptyCellsAtEnd values('P-1');
Query OK, 1 row affected (0.21 sec)
mysql> insert into emptyCellsAtEnd values('P-2');
Query OK, 1 row affected (0.14 sec)
mysql> insert into emptyCellsAtEnd values('');
Query OK, 1 row affected (0.15 sec)
mysql> insert into emptyCellsAtEnd values('P-3');
Query OK, 1 row affected (0.18 sec)
mysql> insert into emptyCellsAtEnd values('P-4');
Query OK, 1 row affected (0.09 sec)
mysql> insert into emptyCellsAtEnd values('P-9');
Query OK, 1 row affected (0.11 sec)
mysql> insert into emptyCellsAtEnd values('');
Query OK, 1 row affected (0.15 sec)
mysql> insert into emptyCellsAtEnd values('P-8');
Query OK, 1 row affected (0.17 sec)현재 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from emptyCellsAtEnd;
실행 결과는 다음과 같습니다. 빈 값들이 중간중간 섞여 있는 것을 확인할 수 있습니다.
+-----------+ | ProductId | +-----------+ | | | P-1 | | P-2 | | | | P-3 | | P-4 | | P-9 | | | | P-8 | +-----------+ 9 rows in set (0.00 sec)
빈 레코드를 끝으로 보내는 쿼리 실행
이제 앞서 소개한 쿼리를 적용하여 빈 셀을 가진 레코드를 결과의 맨 끝으로 배치해 보겠습니다.
mysql> select *from emptyCellsAtEnd -> order by if(ProductId = '' or ProductId is null,1,0),ProductId;
실행 결과는 다음과 같습니다.
+-----------+ | ProductId | +-----------+ | P-1 | | P-2 | | P-3 | | P-4 | | P-8 | | P-9 | | | | | | | +-----------+ 9 rows in set (0.00 sec)
결과 분석
위 출력 결과를 보면 ProductId 값이 있는 레코드(P-1부터 P-9까지)가 알파벳 순서대로 먼저 정렬되고, 빈 값(공백 문자열)을 가진 세 개의 레코드가 모두 맨 끝에 배치된 것을 확인할 수 있습니다.
이 방식은 NULL과 빈 문자열을 모두 처리하므로, 두 경우가 혼재된 실무 데이터에서도 안정적으로 동작합니다. 만약 내림차순으로 정렬하면서 빈 레코드를 끝에 두고 싶다면, 각 정렬 기준 뒤에 DESC를 붙여 order by if(...) DESC, yourColumnName DESC 형태로 작성하면 됩니다.