MySQL에서 무작위 행을 특정 열 기준으로 정렬하기
MySQL에서 RAND() 함수로 무작위 행을 추출한 뒤, 그 결과를 특정 열(예: 이름) 기준으로 다시 정렬하고 싶은 경우가 있습니다. 이때는 서브쿼리와 ORDER BY 절을 조합하면 간단하게 해결할 수 있습니다. 지금부터 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1339
-> (
-> Name varchar(30),
-> Score int
-> );
Query OK, 0 rows affected (0.76 sec)
2. 데이터 삽입
INSERT 명령어를 사용하여 테이블에 여러 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1339 values('Chris',56);
Query OK, 1 row affected (0.36 sec)
mysql> insert into DemoTable1339 values('Bob',46);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1339 values('Adam',78);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1339 values('John',90);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1339 values('Carol',98);
Query OK, 1 row affected (0.12 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1339;
실행 결과는 다음과 같습니다.
+-------+-------+
| Name | Score |
+-------+-------+
| Chris | 56 |
| Bob | 46 |
| Adam | 78 |
| John | 90 |
| Carol | 98 |
+-------+-------+
5 rows in set (0.00 sec)
4. 무작위 행을 Name 열 기준으로 정렬하는 쿼리
아래 쿼리는 RAND() 함수를 이용해 무작위로 4개의 행을 먼저 선택한 후, 그 결과를 Name 열 기준으로 오름차순 정렬합니다.
mysql> select * from (select * from DemoTable1339 order by rand() limit 4) tbl order by Name;
실행 결과는 다음과 같습니다.
+-------+-------+
| Name | Score |
+-------+-------+
| Adam | 78 |
| Bob | 46 |
| Carol | 98 |
| Chris | 56 |
+-------+-------+
4 rows in set (0.05 sec)
쿼리 동작 원리
이 쿼리는 두 단계로 동작합니다. 첫 번째로, 내부 서브쿼리 (select * from DemoTable1339 order by rand() limit 4)가 테이블에서 무작위로 4개의 행을 추출합니다. 두 번째로, 외부 쿼리의 order by Name이 해당 결과를 이름 순으로 정렬합니다.
주의할 점은 서브쿼리에 반드시 별칭(tbl)을 지정해야 한다는 것입니다. MySQL에서는 파생 테이블(서브쿼리 결과)에 별칭이 없으면 오류가 발생하므로 이 부분을 놓치지 않도록 주의하세요. 이 패턴을 활용하면 무작위 샘플링과 정렬을 하나의 쿼리로 손쉽게 처리할 수 있습니다.