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

MySQLで1〜3の乱数を使って対応する行を更新する方法

MySQLで指定した範囲内の乱数を生成し、その値を使って行を更新したい場合は、RAND()関数を利用します。更新時の基本構文は以下のとおりです。

UPDATE テーブル名 SET カラム名 = 値 WHERE カラム名2 = (SELECT FLOOR(1 + RAND() * 3));

このクエリの中で使われている FLOOR(1 + RAND() * 3) は、1〜3の範囲の整数をランダムに生成する式です。RAND()は0以上1未満の小数を返すため、それに3を掛けて1を足し、FLOOR()で小数点以下を切り捨てることで、1・2・3のいずれかの整数が得られます。

実際の動きを確認するために、まずサンプル用のテーブルを作成しましょう。

テーブルの作成

mysql> create table updateRowWith1To3
    -> (
    -> Id int,
    -> Name varchar(100)
    -> );
Query OK, 0 rows affected (0.47 sec)

テストデータの挿入

次に、INSERT文を使ってレコードを登録します。

mysql> insert into updateRowWith1To3 values(1,'John');
Query OK, 1 row affected (0.24 sec)

mysql> insert into updateRowWith1To3 values(2,'Sam');
Query OK, 1 row affected (0.14 sec)

mysql> insert into updateRowWith1To3 values(3,'Carol');
Query OK, 1 row affected (0.14 sec)

mysql> insert into updateRowWith1To3 values(4,'Mike');
Query OK, 1 row affected (0.16 sec)

mysql> insert into updateRowWith1To3 values(5,'Bob');
Query OK, 1 row affected (0.10 sec)

mysql> insert into updateRowWith1To3 values(6,'David');
Query OK, 1 row affected (0.17 sec)

登録データの確認

SELECT文ですべてのレコードを表示してみます。

mysql> select * from updateRowWith1To3;

実行結果は以下のとおりです。

+------+-------+
| Id   | Name  |
+------+-------+
|    1 | John  |
|    2 | Sam   |
|    3 | Carol |
|    4 | Mike  |
|    5 | Bob   |
|    6 | David |
+------+-------+
6 rows in set (0.00 sec)

乱数を使ったUPDATE文の実行

ここで、Idが1〜3のランダムな値に一致する行のNameを「Mary」に更新するクエリを実行します。

mysql> update updateRowWith1To3 set Name='Mary' where Id=(select floor( 1 + RAND() * 3));
Query OK, 1 row affected (0.15 sec)
Rows matched: 1 Changed: 1 Warnings: 0

この例では、乱数として「1」が生成され、Id=1の行が更新されました。乱数は実行ごとに変わるため、Idが2または3の行が更新対象になる場合もあります。

更新結果の確認

もう一度SELECT文を実行して、テーブルの状態を確認してみましょう。

mysql> select * from updateRowWith1To3;

実行結果は以下のとおりです。

+------+-------+
| Id   | Name  |
+------+-------+
|    1 | Mary  |
|    2 | Sam   |
|    3 | Carol |
|    4 | Mike  |
|    5 | Bob   |
|    6 | David |
+------+-------+
6 rows in set (0.00 sec)

応用:複数行をまとめてランダムに更新する

WHERE句で特定の行を絞るのではなく、テーブル内の全行に対して1〜3のランダムな値を設定したい場合は、次のようにSET句の値そのものに乱数式を指定します。

mysql> update updateRowWith1To3 set Name = (select floor( 1 + RAND() * 3));

この方法を使えば、各行ごとに独立した乱数が割り当てられ、テストデータの生成やサンプリング処理などに便利に活用できます。

  1. MySQLのクエリでON UPDATEイベントが発生したかどうかを検出する方法

    MySQLでON UPDATEイベントの発生を検出するには? MySQLでは、ROW_COUNT()関数を使うことで、INSERT ... ON DUPLICATE KEY UPDATE文によって新規レコードが挿入されたのか、それとも既存レコードの更新(ON UPDATEイベント)が発生したのかを判別できます。 戻り値の意味は以下のとおりです。 1 が返された場合:新しいレコードが挿入された 2 が返された場合:クエリによって更新処理(ON UPDATEイベント)が発生した 構文は次のとおりです。 select row_count(); サンプルテーブルの作成 まず、テーブルを作成しまし

  2. MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方

    MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829      (      Name varchar(