RAND()

RAND(), RAND(N)

0 <= v < 1.0 の範囲にあるランダムな浮動小数点値 v を戻します。定数整数引数 N が指定されている場合は、カラム値の反復可能なシークエンスを生成するシード値として使用されます。

mysql> SELECT RAND();
        -> 0.9233482386203
mysql> SELECT RAND(20);
        -> 0.15888261251047
mysql> SELECT RAND(20);
        -> 0.15888261251047
mysql> SELECT RAND();
        -> 0.63553050033332
mysql> SELECT RAND();
        -> 0.70100469486881
mysql> SELECT RAND(20);
        -> 0.15888261251047

定数イニシャライザを使用すれば、シードは実行の前の、ステートメントがコンパイルされる際に一度初期化されます。MySQL 5.1.16 からは、非定数イニシャライザ ( カラム名など ) が引数として使用される場合は、シードは RAND() の各呼び出しの値で初期化されます。( これは、等価の引数値に対しては、RAND() は毎回同じ値を戻すということを示しています ) 。MySQL 5.1.3 から 5.1.15 では、非定数引数は許可されていません。それ以前では、非定数引数の使用の効果は未定義になっています。

i <= R < j の範囲のランダムな整数 R を取得するには、式 FLOOR(i + RAND() * (ji) を使用します。例えば、7 <= R < 12 の範囲にあるランダムな整数を得るには、次のステートメントを使うことができます :

SELECT FLOOR(7 + (RAND() * 5));

ORDER BY はカラムを複数回評価するため、ORDER BY 句内で RAND() 値を持つカラムを使用することはできません。しかし、次のように行を順不同に摘出することは可能です :

mysql> SELECT * FROM tbl_name ORDER BY RAND();

LIMIT と結合された ORDER BY RAND() は、行のセットからランダムなサンプルを選ぶ場合に便利です :

mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d -> ORDER BY RAND() LIMIT 1000;

WHERE 句内の RAND() は、WHERE が実行されるたびに再評価されますのでご注意ください。

RAND() は完璧なランダム発生器というわけではありませんが、同じ MySQL バージョンのプラットフォーム間においてポータブルな ad hoc ランダム数を生成する最も速い方法です。