任意のカラムからn行をランダムに取り出す

大量のレコードがあるテーブルから、ランダムに10件取り出したい、などということがよくある。

これは、random関数(モノによってはrand関数)を用いてソートし、LIMIT句を使うことで解決できる。たとえば、table_aテーブルのidカラムから、ランダムに10件取り出したければ以下のように書けば良い。

PostgreSQL, SQLite
SELECT id FROM table_a ORDER BY random() LIMIT 10;
MySQL
SELECT id FROM table_a ORDER BY rand() LIMIT 10;

注意点

気を付けなければいけないのが、このクエリにかかるコスト。たとえこのテーブルの"id"カラムにインデックスが張ってあっても、ORDER BY random()をするといったん全てに乱数を振ってからソートして表示となるため、全行を一度総なめしないといけない。だからインデックススキャンではなくシーケンシャルスキャンになる。

行数が多くてインデックスを生かしたい場合は、自前で乱数を作ってidを生成し、それにマッチする行をSELECTすることをやった方が効率が良い。(もちろんこの方法は、例えばidが単なる昇順の数値で、最大値が既に分かっている、という条件が必要になるのだが……)

今は面倒なのでORDER BY random() LIMIT 10;を使っている。楽チンだし。