MySQL에서 IN()을 활용한 사용자 지정 정렬 방법
MySQL에서 특정 값들을 우선적으로 정렬하고 싶을 때, IN() 조건과 함께 ORDER BY CASE를 사용하면 원하는 순서대로 결과를 가져올 수 있습니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable752 (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(100)
);
Query OK, 0 rows affected (0.63 sec)
2단계: 데이터 삽입
INSERT 명령어를 사용해 테이블에 여러 레코드를 추가합니다.
mysql> insert into DemoTable752(Name) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable752(Name) values('Carol');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable752(Name) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable752(Name) values('Mike');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable752(Name) values('Sam');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable752(Name) values('Adam');
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable752(Name) values('Chris');
Query OK, 1 row affected (0.26 sec)3단계: 전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable752;
실행 결과는 다음과 같습니다.
+----+-------+
| Id | Name |
+----+-------+
| 1 | John |
| 2 | Carol |
| 3 | Bob |
| 4 | Mike |
| 5 | Sam |
| 6 | Adam |
| 7 | Chris |
+----+-------+
7 rows in set (0.00 sec)
4단계: CASE를 이용한 사용자 지정 정렬 쿼리
이제 CASE 표현식을 활용해 Id가 1, 2, 3인 레코드를 최우선으로 정렬하는 쿼리를 작성합니다.
mysql> select *from DemoTable752
order by
case
when Id IN (1,2,3) then 1
else Id
END,
Name;
결과 확인
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
+----+-------+
| Id | Name |
+----+-------+
| 3 | Bob |
| 2 | Carol |
| 1 | John |
| 4 | Mike |
| 5 | Sam |
| 6 | Adam |
| 7 | Chris |
+----+-------+
7 rows in set (0.00 sec)
동작 원리 설명
위 쿼리의 핵심은 CASE 표현식입니다. Id가 1, 2, 3에 포함되는 레코드는 정렬 기준값으로 1을 받아 가장 앞쪽에 배치되고, 나머지 레코드는 자신의 Id 값을 그대로 정렬 기준으로 사용합니다. 그 후 두 번째 정렬 기준인 Name 컬럼을 통해 Bob, Carol, John 순으로 이름 오름차순 정렬이 적용됩니다.
이처럼 ORDER BY CASE를 활용하면 특정 조건에 맞는 레코드를 우선 노출하거나, 완전히 사용자가 정의한 순서대로 결과를 정렬할 수 있어 실무에서 매우 유용하게 활용됩니다.