MySQL에서 테이블의 데이터를 무작위(랜덤)로 조회하려면 RAND() 함수를 사용하고, 반환받을 레코드 수를 제한하려면 LIMIT 절을 함께 사용하면 됩니다.
이 두 가지를 조합하면 전체 데이터 중에서 원하는 개수만큼의 임의의 행을 손쉽게 추출할 수 있습니다.
1. 샘플 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.54 sec)
2. 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(300);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(600);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(700);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(1000);
Query OK, 1 row affected (0.15 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
출력 결과
+-------+
| Value |
+-------+
| 100 |
| 300 |
| 600 |
| 700 |
| 1000 |
+-------+
5 rows in set (0.00 sec)
4. 랜덤으로 특정 개수의 행 추출하기
아래 쿼리는 ORDER BY RAND()로 모든 행을 무작위로 섞은 뒤, LIMIT를 사용해 그중 4개의 행만 반환합니다.
mysql> select *from DemoTable order by rand() limit 4;
출력 결과
+-------+
| Value |
+-------+
| 1000 |
| 600 |
| 100 |
| 700 |
+-------+
4 rows in set (0.00 sec)
실행할 때마다 결과 순서와 선택되는 행이 달라지는 것을 확인할 수 있습니다.
참고 사항
ORDER BY RAND()는 간편하지만, 내부적으로 모든 행에 난수를 생성한 후 정렬하기 때문에 레코드 수가 매우 많은 대용량 테이블에서는 성능 저하가 발생할 수 있습니다. 이 경우 기본 키 범위에서 난수를 생성해 조인하는 방식 등 대체 기법을 고려하는 것이 좋습니다.