MySQL에서 테이블의 레코드(열 값)를 무작위로 섞으려면 ORDER BY RAND()를 사용하면 됩니다. 이 함수는 각 행에 임의의 난수를 부여한 뒤 그 숫자를 기준으로 정렬하기 때문에, 쿼리를 실행할 때마다 결과 순서가 달라집니다.
1. 샘플 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable1557
-> (
-> SubjectId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> SubjectName varchar(20)
-> );
Query OK, 0 rows affected (0.91 sec)
2. 데이터 삽입
INSERT 명령을 사용해 몇 개의 과목 데이터를 추가합니다.
mysql> insert into DemoTable1557(SubjectName) values('MySQL');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1557(SubjectName) values('MongoDB');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1557(SubjectName) values('Java');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1557(SubjectName) values('C');
Query OK, 1 row affected (0.13 sec)3. 전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select * from DemoTable1557;
실행 결과는 다음과 같습니다.
+-----------+-------------+
| SubjectId | SubjectName |
+-----------+-------------+
| 1 | MySQL |
| 2 | MongoDB |
| 3 | Java |
| 4 | C |
+-----------+-------------+
4 rows in set (0.00 sec)
4. ORDER BY RAND()로 레코드 섞기
이제 MySQL에서 레코드를 무작위로 섞는 쿼리를 실행해 보겠습니다.
mysql> select * from DemoTable1557 order by rand();
실행 결과는 다음과 같습니다.
+-----------+-------------+
| SubjectId | SubjectName |
+-----------+-------------+
| 1 | MySQL |
| 3 | Java |
| 2 | MongoDB |
| 4 | C |
+-----------+-------------+
4 rows in set (0.00 sec)
위 결과를 보면 원래 삽입 순서였던 1 → 2 → 3 → 4가 아닌, 1 → 3 → 2 → 4 순서로 출력된 것을 확인할 수 있습니다.
참고 사항
- RAND()는 쿼리가 실행될 때마다 새로운 난수를 생성하므로, 같은 쿼리를 반복 실행하면 매번 다른 순서의 결과를 얻게 됩니다.
- 레코드 수가 적은 테이블에는 성능상 문제가 없지만, 대용량 테이블에서는 전체 행을 스캔하고 정렬해야 하므로 속도가 느려질 수 있습니다. 이 경우 인덱스 기반의 대체 방안을 고려하는 것이 좋습니다.
- 무작위로 섞은 결과 중 일부만 가져오고 싶다면
LIMIT절과 함께 사용하면 됩니다. 예:SELECT * FROM 테이블명 ORDER BY RAND() LIMIT 3;