MySQL에서 조건에 따라 정렬하는 방법
MySQL에서 특정 조건에 따라 레코드를 정렬하고 싶다면 ORDER BY 절과 함께 CASE WHEN 문을 활용하면 됩니다. 이 방법을 사용하면 단순한 오름차순·내림차순 정렬이 아닌, 사용자가 직접 정의한 우선순위에 따라 결과를 원하는 순서로 배치할 수 있습니다.
예제를 통해 자세히 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table demo51 -> ( -> id int not null auto_increment primary key, -> name varchar(20) -> ); Query OK, 0 rows affected (1.08 sec)
id 컬럼은 자동 증가(auto_increment) 기본 키로 설정했고, 이름을 저장할 name 컬럼은 varchar(20) 타입으로 선언했습니다.
2. 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 샘플 데이터를 입력합니다.
mysql> insert into demo51(name) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into demo51(name) values('Bob');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo51(name) values('David');
Query OK, 1 row affected (0.35 sec)
mysql> insert into demo51(name) values('Sam');
Query OK, 1 row affected (0.14 sec)3. 저장된 레코드 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from demo51;
실행 결과는 다음과 같습니다.
+----+-------+ | id | name | +----+-------+ | 1 | John | | 2 | Bob | | 3 | David | | 4 | Sam | +----+-------+ 4 rows in set (0.00 sec)
현재는 id 순서대로 John, Bob, David, Sam이 차례로 저장되어 있습니다.
4. CASE WHEN을 이용한 조건부 정렬
이제 조건에 따라 정렬하는 핵심 쿼리를 실행해 보겠습니다. CASE WHEN 문에서 각 이름에 서로 다른 숫자 값을 부여하고, 그 값 기준으로 ORDER BY 정렬을 수행합니다.
mysql> select *from demo51 -> order by -> case when name="John" then 110 -> when name="Bob" then 105 -> when name="David" then 104 -> else 101 -> end;
실행 결과는 다음과 같습니다.
+----+-------+ | id | name | +----+-------+ | 4 | Sam | | 3 | David | | 2 | Bob | | 1 | John | +----+-------+ 4 rows in set (0.00 sec)
결과 분석
CASE WHEN 문에서 각 이름에 할당된 값은 다음과 같습니다.
- Sam → 101 (ELSE 조건에 해당)
- David → 104
- Bob → 105
- John → 110
ORDER BY는 기본적으로 오름차순으로 정렬하기 때문에, 숫자가 작은 순서인 Sam(101) → David(104) → Bob(105) → John(110) 순으로 출력됩니다. 만약 반대 순서로 정렬하고 싶다면 쿼리 마지막에 DESC 키워드를 추가하면 됩니다.
이처럼 ORDER BY와 CASE WHEN을 조합하면 특정 값에 우선순위를 부여하거나, 사용자 지정 순서대로 결과를 유연하게 정렬할 수 있습니다. 카테고리별 중요도 순 정렬, 상태값 기반 정렬 등 실무에서 매우 유용하게 활용되는 기법이니 꼭 익혀두시기 바랍니다.