MySQL에서 일반적인 오름차순이나 내림차순 정렬이 아닌, 특정 문자열과 일치하는 데이터를 우선적으로 정렬하고 싶은 경우가 있습니다. 이럴 때는 ORDER BY 절과 CASE 표현식, SUBSTRING() 함수를 함께 사용하면 원하는 결과를 얻을 수 있습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> FirstName varchar(100)
-> );
Query OK, 0 rows affected (0.53 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Adam');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Sam');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('Johnny');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('Joy');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Jace');
Query OK, 1 row affected (0.20 sec)3. 전체 레코드 조회하기
SELECT 문을 사용하여 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
출력 결과
+-----------+
| FirstName |
+-----------+
| John |
| Adam |
| Sam |
| Johnny |
| Joy |
| Jace |
+-----------+
6 rows in set (0.00 sec)
4. 특정 문자열 기준으로 정렬하기
다음은 특정 문자열을 기준으로 정렬하는 쿼리입니다. 예를 들어, 이름이 'Jo'로 시작하는 데이터를 가장 먼저 출력하고 나머지 데이터는 그 뒤에 배치하려면 아래와 같이 작성합니다.
mysql> select *from DemoTable
-> order by case when substring(FirstName, 1, 2) = 'Jo' then 0 else 1 end;
출력 결과
+-----------+
| FirstName |
+-----------+
| John |
| Johnny |
| Joy |
| Adam |
| Sam |
| Jace |
+-----------+
6 rows in set (0.00 sec)
쿼리 동작 원리
위 쿼리가 어떻게 작동하는지 살펴보겠습니다.
- substring(FirstName, 1, 2): 각 이름의 첫 번째 문자부터 2글자를 추출합니다. 예를 들어 'John'에서는 'Jo'가 추출됩니다.
- CASE WHEN ... THEN 0 ELSE 1 END: 추출된 문자열이 'Jo'와 일치하면 0을 반환하고, 그렇지 않으면 1을 반환합니다.
- ORDER BY: 반환된 값(0 또는 1)을 기준으로 오름차순 정렬하므로, 'Jo'로 시작하는 행(값 0)이 항상 앞쪽에 위치하게 됩니다.
이 방식을 응용하면 여러 조건을 단계별로 적용할 수도 있습니다. 예를 들어 THEN 0, THEN 1, THEN 2처럼 값을 다르게 부여하면 우선순위에 따라 그룹화된 정렬 결과를 만들 수 있어, 검색 결과 상단 노출이나 카테고리별 정렬 등 실무에서 매우 유용하게 활용됩니다.