ORDER BY와 CASE를 활용한 혼합 정렬 방법
데이터베이스 작업을 하다 보면 특정 그룹의 행은 무작위(RANDOM) 순서로 표시하고, 나머지 행은 지정한 기준에 따라 정렬해야 하는 경우가 있습니다. 이럴 때 ORDER BY 절과 CASE 문을 함께 사용하면 손쉽게 해결할 수 있습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1926
(
Position varchar(20),
Number int
);
Query OK, 0 rows affected (0.00 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1926 values('Highest',50);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Highest',30);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',100);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',120);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',90);
Query OK, 1 row affected (0.00 sec)3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1926;
실행 결과는 다음과 같습니다.
+----------+--------+
| Position | Number |
+----------+--------+
| Highest | 50 |
| Highest | 30 |
| Lowest | 100 |
| Lowest | 120 |
| Lowest | 90 |
+----------+--------+
5 rows in set (0.00 sec)
4. 무작위 정렬과 기준 정렬을 결합한 쿼리
이제 'Highest' 행은 RAND() 함수를 통해 무작위로 배치하고, 나머지 행은 Number 값을 기준으로 오름차순 정렬하는 쿼리를 살펴보겠습니다.
mysql> select * from DemoTable1926
order by Position desc,case Position when 'Highest' then rand()
else Number end asc;
위 쿼리의 실행 결과는 다음과 같습니다.
+----------+--------+
| Position | Number |
+----------+--------+
| Lowest | 90 |
| Lowest | 100 |
| Lowest | 120 |
| Highest | 50 |
| Highest | 30 |
+----------+--------+
5 rows in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 어떻게 동작하는지 단계별로 살펴보겠습니다.
첫 번째 정렬 조건: Position desc는 Position 열을 내림차순으로 정렬합니다. 알파벳 순서상 'Lowest'가 'Highest'보다 앞에 오므로, 'Lowest' 그룹이 먼저 표시됩니다.
두 번째 정렬 조건: case Position when 'Highest' then rand() else Number end asc는 각 행마다 다르게 적용됩니다. Position 값이 'Highest'인 행에는 RAND() 함수가 적용되어 매번 실행할 때마다 무작위 순서로 배치되고, 그 외의 행('Lowest')에는 Number 열의 값이 사용되어 오름차순으로 정렬됩니다.
이처럼 CASE 문을 ORDER BY 절 안에서 활용하면 행 그룹별로 서로 다른 정렬 규칙을 유연하게 적용할 수 있습니다. 이 기법은 추천 상품 노출, 광고 영역 배치 등 특정 항목만 랜덤하게 보여주고 나머지는 정렬해야 하는 실무 시나리오에서 유용하게 활용됩니다.