MySQL에서 각기 다른 고정된 문자 수 조건에 맞는 레코드를 무작위로 추출하려면 CHAR_LENGTH() 함수와 RAND() 함수를 함께 활용할 수 있습니다. CHAR_LENGTH()는 문자열의 길이를 반환하고, RAND()는 무작위 정렬을 위해 사용됩니다.
실제 동작 과정을 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 테이블을 생성합니다.
mysql> create table DemoTable (Subject text); Query OK, 0 rows affected (0.61 sec)
2. 샘플 데이터 삽입
insert 명령어를 사용해 여러 개의 레코드를 삽입합니다.
mysql> insert into DemoTable values('C');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('MySQL');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Java');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('MongoDB');
Query OK, 1 row affected (0.59 sec)
mysql> insert into DemoTable values('RubyOnRails');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values('C++');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Python');
Query OK, 1 row affected (0.20 sec)3. 전체 레코드 조회
select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
출력 결과
+-------------+ | Subject | +-------------+ | C | | MySQL | | Java | | MongoDB | | RubyOnRails | | C++ | | Python | +-------------+ 7 rows in set (0.00 sec)
4. 고정된 문자 수 조건으로 임의 레코드 3개 선택
다음은 각각 다른 문자 수(7자, 11자, 5자) 조건에 맞는 레코드를 하나씩 무작위로 선택하는 쿼리입니다. 서브쿼리마다 WHERE 절에서 CHAR_LENGTH()로 길이를 필터링한 뒤, ORDER BY RAND()와 LIMIT 1로 무작위 레코드 하나를 추출하고 UNION으로 결합합니다.
mysql> select *from (select *from DemoTable WHERE CHAR_LENGTH(Subject) = 7 ORDER BY RAND() LIMIT 1 ) tbl UNION (select *from DemoTable WHERE CHAR_LENGTH(Subject) = 11 ORDER BY RAND() LIMIT 1 ) UNION (select *from DemoTable WHERE CHAR_LENGTH(Subject) = 5 ORDER BY RAND() LIMIT 1 );
출력 결과
+-------------+ | Subject | +-------------+ | MongoDB | | RubyOnRails | | MySQL | +-------------+ 3 rows in set (0.04 sec)
이처럼 CHAR_LENGTH()와 RAND()를 조합하면 특정 문자 길이 조건을 만족하는 레코드를 각각 무작위로 손쉽게 추출할 수 있습니다. 필요에 따라 문자 수 조건과 UNION 개수를 자유롭게 조절하여 다양한 형태의 무작위 샘플링 쿼리를 작성할 수 있습니다.