Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 레코드를 무작위로 섞은 뒤 이름 기준 오름차순으로 정렬하는 방법

MySQL에서 레코드를 무작위로 추출한 후, 그 결과를 특정 컬럼(예: 이름) 기준으로 오름차순 정렬해야 하는 경우가 있습니다. 이럴 때는 서브쿼리(subquery)를 활용하면 간단하게 해결할 수 있습니다. 무작위 추출에는 rand() 함수를 사용하고, 최종 정렬에는 ORDER BY 절을 사용합니다.

기본 문법

먼저 내부 서브쿼리에서 ORDER BY rand()LIMIT로 레코드를 무작위로 가져온 뒤, 외부 쿼리에서 원하는 컬럼 기준으로 다시 정렬하는 구조입니다.

select *from
(
    select *from yourTableName order by rand() limit anyIntegerValue;
) anyVariableName
order by yourColumnName;

예제 테이블 생성

개념을 이해하기 위해 Id와 Name 두 개의 컬럼을 가진 테이블을 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.

mysql> create table OrderByRandName
    −> (
    −> Id int,
    −> Name varchar(100)
    −> );
Query OK, 0 rows affected (0.96 sec)

샘플 데이터 삽입

insert 명령으로 테스트용 레코드를 삽입합니다.

mysql> insert into OrderByRandName values(100,'John');
Query OK, 1 row affected (0.18 sec)

mysql> insert into OrderByRandName values(101,'Bob');
Query OK, 1 row affected (0.11 sec)

mysql> insert into OrderByRandName values(102,'Johnson');
Query OK, 1 row affected (0.19 sec)

mysql> insert into OrderByRandName values(103,'David');
Query OK, 1 row affected (0.22 sec)

mysql> insert into OrderByRandName values(104,'Smith');
Query OK, 1 row affected (0.17 sec)

mysql> insert into OrderByRandName values(105,'Taylor');
Query OK, 1 row affected (0.20 sec)

mysql> insert into OrderByRandName values(106,'Sam');
Query OK, 1 row affected (0.12 sec)

mysql> insert into OrderByRandName values(107,'Robert');
Query OK, 1 row affected (0.22 sec)

mysql> insert into OrderByRandName values(108,'Michael');
Query OK, 1 row affected (0.16 sec)

mysql> insert into OrderByRandName values(109,'Mark');
Query OK, 1 row affected (0.17 sec)

전체 레코드 조회

select 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from OrderByRandName;

실행 결과는 다음과 같습니다.

+------+---------+
| Id   | Name    |
+------+---------+
|  100 | John    |
|  101 | Bob     |
|  102 | Johnson |
|  103 | David   |
|  104 | Smith   |
|  105 | Taylor  |
|  106 | Sam     |
|  107 | Robert  |
|  108 | Michael |
|  109 | Mark    |
+------+---------+
10 rows in set (0.00 sec)

무작위 추출 후 이름 오름차순 정렬 쿼리

이제 rand()로 레코드를 무작위로 섞은 뒤, Name 컬럼 기준으로 오름차순 정렬하는 실제 쿼리입니다.

mysql> select *from
    −> (
    −> select *from OrderByRandName order by rand() limit 10
    −> )tbl1
    −> order by Name;

실행 결과를 보면 레코드가 무작위로 선택된 후, 이름이 알파벳 순(Bob → David → John...)으로 깔끔하게 정렬된 것을 확인할 수 있습니다.

+------+---------+
| Id   | Name    |
+------+---------+
|  101 | Bob     |
|  103 | David   |
|  100 | John    |
|  102 | Johnson |
|  109 | Mark    |
|  108 | Michael |
|  107 | Robert  |
|  106 | Sam     |
|  104 | Smith   |
|  105 | Taylor  |
+------+---------+
10 rows in set (0.39 sec)

참고: 성능 관련 주의사항

ORDER BY rand()는 테이블의 모든 행에 난수를 부여한 후 정렬하기 때문에, 레코드 수가 많은 대형 테이블에서는 성능 저하가 발생할 수 있습니다. 소규모 데이터나 관리 목적의 조회에는 적합하지만, 대량 데이터에서 무작위 샘플링이 필요하다면 인덱스를 활용한 방식이나 애플리케이션 단계에서의 처리를 함께 고려하는 것이 좋습니다.