MySQL에서 테이블의 데이터를 무작위로 조회하고 싶다면 RAND() 함수를 사용하면 됩니다. 이 함수는 쿼리가 실행될 때마다 서로 다른 임의의 결과를 반환해 주기 때문에, 랜덤 추첨이나 샘플 데이터 추출 등에 유용하게 활용할 수 있습니다.
RAND() 함수 기본 문법
MySQL에서 랜덤 결과를 선택하는 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName ORDER BY RAND() LIMIT 1;
여기서 ORDER BY RAND()는 모든 행을 임의의 순서로 정렬하고, LIMIT 1은 그중 첫 번째 행 하나만 가져오는 역할을 합니다. 여러 개의 랜덤 결과가 필요하다면 LIMIT 값을 원하는 개수만큼 조정하면 됩니다.
예제 테이블 생성하기
실제 동작을 확인하기 위해 먼저 예제용 테이블을 생성해 보겠습니다. 아래 쿼리로 학생 정보를 저장할 테이블을 만듭니다.
mysql> CREATE TABLE selectRandomRecord
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20)
-> );
Query OK, 0 rows affected (0.53 sec)
샘플 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 몇 개의 레코드를 추가합니다.
mysql> INSERT INTO selectRandomRecord(StudentName) VALUES('John');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO selectRandomRecord(StudentName) VALUES('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO selectRandomRecord(StudentName) VALUES('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO selectRandomRecord(StudentName) VALUES('Sam');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO selectRandomRecord(StudentName) VALUES('Mike');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO selectRandomRecord(StudentName) VALUES('Robert');
Query OK, 1 row affected (0.20 sec)전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM selectRandomRecord;
실행 결과는 다음과 같습니다.
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1 | John |
| 2 | Carol |
| 3 | Bob |
| 4 | Sam |
| 5 | Mike |
| 6 | Robert |
+-----------+-------------+
6 rows in set (0.00 sec)
RAND()로 랜덤 레코드 조회하기
이제 ORDER BY RAND()와 LIMIT 1을 조합한 쿼리를 실행하여 임의의 레코드 하나를 선택해 보겠습니다.
mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1;
실행 결과는 다음과 같습니다.
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 3 | Bob |
+-----------+-------------+
1 row in set (0.00 sec)
쿼리 재실행으로 다른 결과 확인하기
동일한 쿼리를 다시 한번 실행하면 매번 다른 랜덤 값이 반환되는 것을 확인할 수 있습니다.
mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1;
이번에는 다른 레코드가 선택되었습니다.
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 5 | Mike |
+-----------+-------------+
1 row in set (0.00 sec)
참고 사항: 성능 최적화 팁
ORDER BY RAND()는 테이블의 모든 행을 읽은 후 임시로 정렬 작업을 수행하기 때문에, 레코드 수가 수백만 건에 달하는 대용량 테이블에서는 성능 저하가 발생할 수 있습니다. 이런 경우에는 다음과 같은 대안을 고려해 볼 수 있습니다.
- 랜덤 ID 방식:
FLOOR(RAND() * MAX(id))를 활용해 임의의 PK 값을 생성한 후 해당 행만 조회하는 방법입니다. - 응용 프로그램 단 처리: 전체 ID 목록만 가볍게 가져온 뒤 애플리케이션에서 랜덤으로 하나를 골라 상세 데이터를 조회하는 방식입니다.
소규모 테이블이라면 ORDER BY RAND() LIMIT 1이 가장 간단하고 직관적인 해결책이므로 부담 없이 사용하셔도 좋습니다.