MySQL에서 테이블에 저장된 데이터 중 무작위(random)로 한 개 이상의 행을 조회하고 싶다면, RAND() 함수와 LIMIT 절을 함께 사용하면 됩니다. 이 방법은 각 행에 임의의 난수를 부여한 뒤 정렬하고, 상위 N개의 행만 가져오는 방식으로 동작합니다.
기본 문법
SELECT * FROM yourTableName ORDER BY RAND() LIMIT 1;
위 쿼리는 지정한 테이블의 모든 행을 무작위 순서로 섞은 후, 그중 첫 번째 행 하나만 반환합니다. LIMIT 값을 조정하면 원하는 개수만큼의 임의 행을 가져올 수도 있습니다.
예제 테이블 생성하기
실제 동작을 확인하기 위해 먼저 예제용 테이블을 생성해 보겠습니다.
mysql> create table generateRandomRow
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(20),
-> Age int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (1.66 sec)테이블이 정상적으로 생성되었습니다. 이제 INSERT 명령어로 샘플 데이터를 입력합니다.
샘플 데이터 삽입
mysql> insert into generateRandomRow(Name,Age) values('John',23);
Query OK, 1 row affected (0.22 sec)
mysql> insert into generateRandomRow(Name,Age) values('Larry',21);
Query OK, 1 row affected (0.32 sec)
mysql> insert into generateRandomRow(Name,Age) values('David',21);
Query OK, 1 row affected (0.39 sec)
mysql> insert into generateRandomRow(Name,Age) values('Carol',24);
Query OK, 1 row affected (0.21 sec)
mysql> insert into generateRandomRow(Name,Age) values('Bob',27);
Query OK, 1 row affected (0.14 sec)
mysql> insert into generateRandomRow(Name,Age) values('Mike',29);
Query OK, 1 row affected (0.19 sec)
mysql> insert into generateRandomRow(Name,Age) values('Sam',26);
Query OK, 1 row affected (0.17 sec)총 7명의 사용자 데이터가 입력되었습니다. SELECT 문으로 전체 데이터를 확인해 보겠습니다.
전체 데이터 조회
mysql> select * from generateRandomRow;
실행 결과는 다음과 같습니다.
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | John | 23 | | 2 | Larry | 21 | | 3 | David | 21 | | 4 | Carol | 24 | | 5 | Bob | 27 | | 6 | Mike | 29 | | 7 | Sam | 26 | +----+-------+------+ 7 rows in set (0.00 sec)
RAND()로 임의의 행 선택하기
이제 RAND() 함수를 사용해 테이블에서 무작위로 한 행을 추출해 보겠습니다.
mysql> select * from generateRandomRow order by rand() limit 1;
실행할 때마다 다른 결과가 출력됩니다. 첫 번째 실행 결과는 다음과 같습니다.
+----+------+------+ | Id | Name | Age | +----+------+------+ | 5 | Bob | 27 | +----+------+------+ 1 row in set (0.00 sec)
동일한 쿼리를 다시 실행하면 이번에는 다른 행이 반환되는 것을 확인할 수 있습니다.
mysql> select * from generateRandomRow order by rand() limit 1;
두 번째 실행 결과입니다.
+----+------+------+ | Id | Name | Age | +----+------+------+ | 6 | Mike | 29 | +----+------+------+ 1 row in set (0.00 sec)
참고 사항: 성능 최적화
ORDER BY RAND()는 모든 행에 난수를 부여한 후 전체를 정렬하므로, 데이터가 많은 대형 테이블에서는 성능 저하가 발생할 수 있습니다. 레코드 수가 수백만 건 이상인 경우에는 다음과 같은 대안을 고려하는 것이 좋습니다.
- MAX(Id)와 랜덤 값 조합:
FLOOR(1 + RAND() * MAX(Id))를 활용해 임의의 ID를 뽑은 뒤 해당 행만 조회하는 방식으로, 정렬 비용 없이 빠르게 처리할 수 있습니다. - 응용 프로그램 단 처리: 전체 ID 목록만 가벼운 쿼리로 가져온 뒤, 애플리케이션 코드에서 무작위 ID를 선택해 해당 행만 다시 조회하는 방법도 효율적입니다.
소규모 테이블이라면 ORDER BY RAND() LIMIT 1 방식이 가장 간단하고 직관적인 해결책이므로 부담 없이 사용해도 됩니다.