Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのランダム関数の使い方についてまとめています。

SQLでランダムを使ったサンプルコード集

以下は、MySQLでのサンプルコードです。MySQLのサンプルデータベースEmployeesを使用しています。

SQLでランダムな数(乱数)を取得する

乱数はrand()で取得可能です。0.0~1.0の間の乱数を取得可能です。整数の乱数を取得するには、floor(切り捨て)関数を組み合わせます。

例えば、5以上20以下の乱数を取得するには、floor(5+rand()*15)と記述します。

  1. mysql> select rand();
  2. +---------------------+
  3. | rand() |
  4. +---------------------+
  5. | 0.06205727631417781 |
  6. +---------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> select floor(5 + RAND() * 15);
  10. +------------------------+
  11. | floor(5 + RAND() * 15) |
  12. +------------------------+
  13. | 8 |
  14. +------------------------+
  15. 1 row in set (0.00 sec)
  16.  
  17. mysql> select floor(5 + RAND() * 15);
  18. +------------------------+
  19. | floor(5 + RAND() * 15) |
  20. +------------------------+
  21. | 17 |
  22. +------------------------+
  23. 1 row in set (0.00 sec)
  24.  
  25. mysql> select floor(5 + RAND() * 15);
  26. +------------------------+
  27. | floor(5 + RAND() * 15) |
  28. +------------------------+
  29. | 12 |
  30. +------------------------+
  31. 1 row in set (0.00 sec)

SQLでランダムな値を テーブルに挿入する

テーブルの値に乱数を挿入することも可能です。以下のサンプルは、同じinsert文ですが、実行するたびに異なる値がテーブルに挿入されます。

  1. mysql> create table employees.randomtable ( r int not null );
  2. Query OK, 0 rows affected (0.12 sec)
  3.  
  4. mysql> insert into randomtable ( r ) values ( floor(5 + RAND() * 15) );
  5. Query OK, 1 row affected (0.01 sec)
  6.  
  7. mysql> insert into randomtable ( r ) values ( floor(5 + RAND() * 15) );
  8. Query OK, 1 row affected (0.01 sec)
  9.  
  10. mysql> insert into randomtable ( r ) values ( floor(5 + RAND() * 15) );
  11. Query OK, 1 row affected (0.01 sec)
  12.  
  13. mysql> select * from randomtable;
  14. +----+
  15. | r |
  16. +----+
  17. | 7 |
  18. | 16 |
  19. | 9 |
  20. +----+
  21. 3 rows in set (0.00 sec)

SQLでランダムな順番で レコードを取り出す

下記のサンプルは、対象テーブルからランダムな順番で10件のデータを取り出すサンプルです。

ただし、テーブル全体に対して乱数でソートをかけるため、クエリが非常に重くなるので注意が必要。以下のケースでは、10件の取得に3.07秒かかっています。

explainで実行計画をチェックすると、テーブル全体(約28万件)に対してインデックスなしのテーブルフルスキャンを実行していることがわかります。

【関連記事】
SQLのexplainは、実行計画を表示 遅いSQLのボトルネックを発見する

件数の少ないテーブルに対しては、有効な方法と言えるでしょう。

  1. select *
  2. from salaries
  3. order by Rand()
  4. limit 10;
  5. +--------+--------+------------+------------+
  6. | emp_no | salary | from_date | to_date |
  7. +--------+--------+------------+------------+
  8. | 453998 | 49498 | 1988-05-23 | 1988-06-29 |
  9. | 269607 | 65039 | 2002-06-08 | 9999-01-01 |
  10. | 85666 | 80434 | 1994-01-14 | 1995-01-14 |
  11. | 464086 | 62364 | 1999-11-26 | 2000-11-25 |
  12. | 441784 | 59685 | 1997-06-26 | 1998-06-26 |
  13. | 470206 | 80771 | 1999-05-31 | 2000-05-30 |
  14. | 234186 | 65600 | 2001-03-29 | 2002-03-29 |
  15. | 451094 | 54430 | 1995-02-10 | 1996-02-10 |
  16. | 454337 | 50130 | 1994-10-31 | 1995-10-31 |
  17. | 89644 | 57349 | 1992-07-28 | 1993-07-28 |
  18. +--------+--------+------------+------------+
  19. 10 rows in set (3.07 sec)
  20.  
  21. mysql> explain select * from salaries order by Rand() limit 10;
  22. +----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------+
  23. | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
  24. +----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------+
  25. | 1 | SIMPLE | salaries | NULL | ALL | NULL | NULL | NULL | NULL | 2838426 | 100.00 | Using temporary; Using filesort |
  26. +----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------+
  27. 1 row in set, 1 warning (0.02 sec)

【関連記事】
SQL limitを使ったページング、ランダム抽出、速度改善をおこなう

まとめ

ポテパンダの一言メモ
  • 乱数はrand()関数で取得可能
  • 整数の乱数を取得するにはfloor関数を組み合わせる
  • テーブルからランダム順にレコード取得する際は、テーブル件数に注意

 

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。