MySQL 테이블에서 중복 없이 무작위로 행 선택하기
MySQL 테이블에서 행을 무작위로 선택하려면 ORDER BY RAND()와 LIMIT을 함께 사용하면 됩니다. 여기에 중복을 제거한 고유한 값만 가져오고 싶다면 DISTINCT 키워드를 추가하면 됩니다.
먼저 예제를 통해 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(40)
);
Query OK, 0 rows affected (0.54 sec)
1. 샘플 데이터 삽입하기
INSERT 명령으로 테이블에 레코드를 삽입합니다. 이후 DISTINCT의 효과를 확인하기 위해 의도적으로 중복된 이름도 함께 넣겠습니다.
mysql> insert into DemoTable(Name) values('John Doe');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Name) values('Chris Brown');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Name) values('Adam Smith');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(Name) values('John Doe');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable(Name) values('John Doe');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable(Name) values('Chris Brown');
Query OK, 1 row affected (0.53 sec)
mysql> insert into DemoTable(Name) values('Adam Smith');
Query OK, 1 row affected (0.12 sec)2. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----+-------------+
| Id | Name |
+----+-------------+
| 1 | John Doe |
| 2 | Chris Brown |
| 3 | Adam Smith |
| 4 | John Doe |
| 5 | John Doe |
| 6 | Chris Brown |
| 7 | Adam Smith |
+----+-------------+
7 rows in set (0.00 sec)
결과를 보면 'John Doe', 'Chris Brown', 'Adam Smith'가 각각 중복되어 저장되어 있는 것을 확인할 수 있습니다.
3. 무작위로 고유한 행 선택하기
테이블에서 중복을 제거하고 고유한 이름을 무작위로 선택하는 쿼리는 다음과 같습니다.
mysql> select distinct Name from DemoTable order by rand() limit 3;
쿼리를 실행할 때마다 결과 순서는 달라지며, 출력 예시는 다음과 같습니다.
+-------------+
| Name |
+-------------+
| Chris Brown |
| John Doe |
| Adam Smith |
+-------------+
3 rows in set (0.00 sec)
핵심 정리
- DISTINCT : 중복 값을 제거하고 고유한 값만 반환합니다.
- ORDER BY RAND() : 결과 집합을 무작위 순서로 정렬합니다.
- LIMIT n : 반환할 행의 개수를 제한합니다.
참고로 ORDER BY RAND()는 전체 테이블을 스캔한 뒤 정렬하기 때문에 대용량 테이블에서는 성능이 저하될 수 있습니다. 따라서 이 방식은 소규모 데이터나 간단한 용도에 적합하며, 대량의 데이터를 다룰 때는 임의의 ID를 생성한 후 조인하는 등의 다른 기법을 고려하는 것이 좋습니다.