MySQL에서는 저장 프로시저(Stored Procedure)와 반복문을 활용하면 난수 여러 개를 손쉽게 생성할 수 있습니다. 아래 쿼리는 RAND() 함수를 이용해 난수 5개를 출력하는 저장 프로시저를 만드는 예제입니다.
저장 프로시저 생성하기
먼저 구분자(Delimiter)를 변경한 뒤, 기존에 같은 이름의 프로시저가 있다면 삭제하고 새 프로시저를 생성합니다.
mysql> DELIMITER //
mysql> DROP PROCEDURE IF EXISTS RandomNumbers;
-> CREATE PROCEDURE RandomNumbers()
-> BEGIN
-> SET @i = 0;
-> REPEAT
-> SELECT RAND() AS 'Random Number';
-> SET @i = @i + 1;
-> UNTIL @i >=5 END REPEAT;
-> END
-> //
Query OK, 0 rows affected (0.16 sec)
Query OK, 0 rows affected (0.16 sec)
코드 설명
- DELIMITER //: 저장 프로시저 내부의 세미콜론(;)이 문장 종료로 해석되지 않도록 구분자를
//로 임시 변경합니다. - DROP PROCEDURE IF EXISTS: 같은 이름의 프로시저가 이미 존재할 경우 오류를 방지하기 위해 먼저 삭제합니다.
- REPEAT ... UNTIL: 카운터 변수
@i가 5에 도달할 때까지 반복 실행됩니다. - RAND(): 0 이상 1 미만 범위의 부동소수점 난수를 반환하는 MySQL 내장 함수입니다.
프로시저 호출하여 결과 확인하기
구분자를 원래대로 되돌린 후 CALL 문으로 프로시저를 호출하면 난수 5개가 순차적으로 출력됩니다.
mysql> DELIMITER ;
mysql> CALL RandomNumbers();
+---------------------+
| Random Number |
+---------------------+
| 0.25968261739209536 |
+---------------------+
1 row in set (0.00 sec)
+--------------------+
| Random Number |
+--------------------+
| 0.1659662734400167 |
+--------------------+
1 row in set (0.01 sec)
+---------------------+
| Random Number |
+---------------------+
| 0.05078354575744229 |
+---------------------+
1 row in set (0.01 sec)
+--------------------+
| Random Number |
+--------------------+
| 0.7560189392008064 |
+--------------------+
1 row in set (0.04 sec)
+------------------+
| Random Number |
+------------------+
| 0.62774408946535 |
+------------------+
1 row in set (0.04 sec)
Query OK, 0 rows affected (0.05 sec)
실행할 때마다 결과값은 달라지며, 위 예제에서는 0과 1 사이의 서로 다른 난수 5개가 각각 출력된 것을 확인할 수 있습니다.
참고: 정수 범위의 난수가 필요한 경우
만약 0과 1 사이의 소수가 아니라 특정 정수 범위의 난수가 필요하다면 FLOOR(RAND() * N) 형태로 응용할 수 있습니다. 예를 들어 1부터 100 사이의 정수 난수를 얻으려면 다음과 같이 작성합니다.
SELECT FLOOR(1 + RAND() * 100) AS 'Random Number';
이처럼 저장 프로시저와 RAND() 함수를 조합하면 테스트 데이터 생성, 샘플링 등 다양한 상황에서 유용하게 활용할 수 있습니다.