MySQL에서 특정 값을 맨 뒤로 정렬하기
MySQL에서 데이터를 조회할 때, 'Not Known'처럼 의미가 없거나 임시적인 값은 목록 맨 아래로 보내고 나머지 값들은 알파벳 순서대로 정렬하고 싶은 경우가 있습니다. 이럴 때 ORDER BY 절과 불리언(Boolean) 표현식을 조합하면 손쉽게 해결할 수 있습니다. 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table demo57 -> ( -> id int not null auto_increment primary key, -> full_name varchar(20) -> ); Query OK, 0 rows affected (1.60 sec)
2단계: 샘플 데이터 삽입
insert 명령어로 레코드를 몇 개 추가합니다. 이 중 'Not Known'이 곧 맨 뒤로 보낼 대상 값입니다.
mysql> insert into demo57(full_name) values('John Smith');
Query OK, 1 row affected (0.24 sec)
mysql> insert into demo57(full_name) values('David Miller');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo57(full_name) values('Not Known');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo57(full_name) values('Chris Brown');
Query OK, 1 row affected (0.31 sec)
3단계: 저장된 데이터 확인
select 문으로 테이블에 들어 있는 전체 레코드를 조회합니다.
mysql> select *from demo57;
실행 결과는 다음과 같습니다.
+----+--------------+ | id | full_name | +----+--------------+ | 1 | John Smith | | 2 | David Miller | | 3 | Not Known | | 4 | Chris Brown | +----+--------------+ 4 rows in set (0.00 sec)
ORDER BY로 특정 값을 마지막에 배치하는 쿼리
'Not Known'을 결과의 맨 끝으로 보내면서 나머지 이름들은 알파벳 역순으로 정렬하는 쿼리는 다음과 같습니다.
mysql> select *from demo57 -> order by(full_name="Not Known"),full_name desc;
실행 결과는 다음과 같습니다.
+----+--------------+ | id | full_name | +----+--------------+ | 1 | John Smith | | 2 | David Miller | | 4 | Chris Brown | | 3 | Not Known | +----+--------------+ 4 rows in set (0.00 sec)
출력을 보면 'Not Known'이 마지막 행으로 밀려나고, 나머지 이름들은 알파벳 역순(J → D → C)으로 정렬된 것을 확인할 수 있습니다.
동작 원리
- (full_name="Not Known"): 각 행에 대해 값이 일치하면 1(true), 일치하지 않으면 0(false)을 반환합니다.
- 기본 오름차순 정렬: 0이 1보다 앞서므로, 일치하지 않는 행들이 먼저 출력되고 일치하는 행은 자연스럽게 맨 뒤로 이동합니다.
- full_name desc: 첫 번째 정렬 기준이 동일한 행들 사이에서 이름을 내림차순으로 정렬합니다.
이 기법은 'Unknown', 'N/A', 빈 문자열 같은 플레이스홀더 값을 항상 목록 하단에 유지하고 싶을 때 실무에서 매우 유용하게 활용됩니다.