MySQL에서 조회 결과 중 특정 조건에 맞는 레코드를 가장 위쪽에 배치하고 싶다면 ORDER BY CASE 구문을 활용하면 됩니다. 이 글에서는 예제 테이블을 만들고, 실제 쿼리를 통해 원하는 레코드를 상단으로 정렬하는 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
StudentName varchar(100),
StudentMarks int
);
Query OK, 0 rows affected (0.97 sec)
2. 레코드 삽입
INSERT 명령어를 사용해 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('Chris',45);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('John',67);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('David',89);
Query OK, 1 row affected (0.46 sec)
mysql> insert into DemoTable values('John',98);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Mike',79);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('John',99);
Query OK, 1 row affected (0.11 sec)
3. 전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+--------------+ | StudentName | StudentMarks | +-------------+--------------+ | Chris | 45 | | John | 67 | | David | 89 | | John | 98 | | Mike | 79 | | John | 99 | +-------------+--------------+ 6 rows in set (0.00 sec)
4. ORDER BY CASE로 특정 레코드 맨 위에 배치하기
이제 핵심인 쿼리입니다. 아래 쿼리는 'John'이라는 이름을 가진 레코드를 결과의 맨 위로 정렬합니다.
mysql> select *from DemoTable order by case when StudentName = 'John' then 1 else 2 end, StudentName, StudentMarks;
실행 결과를 보면 'John' 레코드가 먼저 출력되고, 나머지 레코드가 그 뒤에 정렬되어 있는 것을 확인할 수 있습니다.
+-------------+--------------+ | StudentName | StudentMarks | +-------------+--------------+ | John | 67 | | John | 98 | | John | 99 | | Chris | 45 | | David | 89 | | Mike | 79 | +-------------+--------------+ 6 rows in set (0.00 sec)
동작 원리와 정리
ORDER BY CASE는 CASE 표현식을 정렬 기준으로 사용하는 방식입니다. 조건에 해당하는 레코드에는 낮은 값(예: 1)을, 나머지에는 더 큰 값(예: 2)을 반환하도록 하면 조건에 맞는 레코드가 자연스럽게 결과 집합의 최상단에 배치됩니다. 이후 StudentName, StudentMarks처럼 추가 정렬 기준을 함께 지정하면 같은 우선순위 그룹 안에서도 일관된 순서로 정렬할 수 있어, 우선순위 정렬이 필요한 목록 화면이나 리포트 쿼리에서 매우 유용하게 활용됩니다.