MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのストアドプロシージャで5つの乱数を生成する方法

MySQLでランダムな数値を抽出するには、ORDER BY RAND() を活用するのが便利です。本記事では、テーブルに登録されたデータの中からランダムに5つの値を選び出し、それをストアドプロシージャとして作成・呼び出すまでの手順を、実際のコード例とともにわかりやすく解説します。

1. サンプルテーブルを作成する

まず、乱数の候補となる値を格納するためのテーブルを作成します。

mysql> create table DemoTable (Value int);
Query OK, 0 rows affected (0.76 sec)

2. テーブルにデータを挿入する

続いて、INSERT文を使ってサンプルデータを登録していきます。

mysql> insert into DemoTable values(89);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(98);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable values(78);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values(75);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(76);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(74);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(99);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(101);
Query OK, 1 row affected (0.15 sec)

3. 登録したデータを確認する

SELECT文ですべてのレコードを表示して、正しく登録されているか確認しましょう。

mysql> select *from DemoTable;

実行結果は以下のようになります。

+-------+
| Value |
+-------+
| 89    |
| 98    |
| 10    |
| 78    |
| 75    |
| 76    |
| 74    |
| 99    |
| 101   |
+-------+
9 rows in set (0.00 sec)

4. 5つの乱数を生成するストアドプロシージャを作成する

ここからが本題です。次のストアドプロシージャでは、以下のような仕組みでランダムな5つの値を取得しています。

  • WHERE句BETWEEN 10 AND 100 で10〜100の範囲に候補を絞り込む
  • ORDER BY RAND():レコードをランダムに並べ替える
  • LIMIT 5:ランダムに並んだ中から5件だけ抽出する
  • GROUP_CONCAT():抽出した5つの値を「/」区切りの1つの文字列に連結する
  • 内部サブクエリ:最終的な表示結果を ORDER BY Value で昇順に整列させる
mysql> DELIMITER //
mysql> CREATE PROCEDURE generate_Random5Numbers()
    BEGIN
      SELECT GROUP_CONCAT(Value SEPARATOR '/')
      FROM ( SELECT Value
          FROM ( SELECT Value
             FROM DemoTable
             WHERE Value BETWEEN 10 AND 100
          ORDER BY RAND()
          LIMIT 5) Ascending_Order
       ORDER BY Value) 5Values;
    END
    //
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;

なお、冒頭の DELIMITER // は、プロシージャ本文内のセミコロン(;)を文の区切りと誤認識されないように、一時的に区切り文字を変更するための記述です。作成が完了したら DELIMITER ; で元に戻すのを忘れないようにしましょう。

5. ストアドプロシージャを呼び出す

作成したストアドプロシージャは、CALLコマンドで実行できます。

mysql> call generate_Random5Numbers();

実行すると、ランダムに選ばれた5つの値が「/」区切りで表示されます。実行するたびに結果は変わります。

+-----------------------------------+
| GROUP_CONCAT(Value SEPARATOR '/') |
+-----------------------------------+
| 89/74/78/99/10                    |
+-----------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)

まとめ

ORDER BY RAND()LIMIT、さらに GROUP_CONCAT() を組み合わせることで、テーブル内のデータからランダムな5つの値を簡単に抽出できます。抽出対象の範囲を変えたい場合は、WHERE句の BETWEEN の条件を調整してください。ただし、大規模なテーブルでは ORDER BY RAND() がフルスキャンとなりパフォーマンスが低下する場合があるため、実運用ではデータ量にも注意が必要です。

  1. MySQLストアドプロシージャで条件分岐を正しく実装する方法を解説

    MySQLストアドプロシージャにおける条件分岐の基本MySQLのストアドプロシージャ内で条件を設定するには、IF ... THEN ... ELSE ... END IF構文を使用します。基本的な書式は以下のとおりです。if yourCondition then yourStatement1; else yourStatement2; end if; end //この構文を使うことで、条件が真(true)の場合はTHEN以降の処理が実行され、偽(false)の場合はELSE以降の処理が実行されます。 実際の実装例それでは、上記の構文をもとに、具体的なストアドプロシージャを作成し

  2. MySQLストアドプロシージャにおけるDELIMITERの正しい使い方を徹底解説

    DELIMITERとは?なぜ必要なのかMySQLクライアントは、デフォルトでセミコロン(;)を文の終端記号として扱います。しかし、ストアドプロシージャの本体には複数のSQL文が含まれ、それぞれがセミコロンで終わるため、そのまま定義すると途中で構文解析が中断されてしまいます。そこで、DELIMITERコマンドを使って、一時的に区切り文字を別の記号(例://)に変更する必要があります。これにより、プロシージャ全体をひとつのまとまりとして登録できるようになります。DELIMITERの正しい記述方法基本的な書き方は以下の通りです。DELIMITER //CREATE PROCEDURE yourSto