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

MySQLでランダムな行を選択する方法|ORDER BY RAND()の使い方を実例で解説

MySQLでテーブルからランダムな行を取得したい場合には、RAND()関数LIMIT句を組み合わせるのが最もシンプルな方法です。この記事では、基本的な構文から実際に動作するサンプルまで、手順を追ってわかりやすく解説します。

ランダムな行を取得する基本構文

ランダムな行を選択するには、以下のように RAND() を使って並べ替えを行い、LIMIT で取得する件数を指定します。

SELECT * FROM yourTableName ORDER BY RAND() LIMIT 1;

この構文では、すべての行に対して乱数を生成し、その値をもとに並べ替えた結果の先頭1行だけを返します。LIMIT の数値を変更すれば、複数のランダムな行を取得することも可能です。

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

まずは動作を確認するためのテーブルを作成しましょう。以下のクエリを実行します。

mysql> create table generateRandomRow
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name varchar(20),
    -> Age int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (1.66 sec)

テストデータを挿入する

次に、INSERT文を使っていくつかのレコードを登録します。

mysql> insert into generateRandomRow(Name,Age) values('John',23);
Query OK, 1 row affected (0.22 sec)

mysql> insert into generateRandomRow(Name,Age) values('Larry',21);
Query OK, 1 row affected (0.32 sec)

mysql> insert into generateRandomRow(Name,Age) values('David',21);
Query OK, 1 row affected (0.39 sec)

mysql> insert into generateRandomRow(Name,Age) values('Carol',24);
Query OK, 1 row affected (0.21 sec)

mysql> insert into generateRandomRow(Name,Age) values('Bob',27);
Query OK, 1 row affected (0.14 sec)

mysql> insert into generateRandomRow(Name,Age) values('Mike',29);
Query OK, 1 row affected (0.19 sec)

mysql> insert into generateRandomRow(Name,Age) values('Sam',26);
Query OK, 1 row affected (0.17 sec)

登録済みの全レコードを確認する

SELECT文で全データを表示し、テーブルの中身を確認しておきましょう。

mysql> select * from generateRandomRow;

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

+----+-------+------+
| Id | Name  | Age  |
+----+-------+------+
|  1 | John  |   23 |
|  2 | Larry |   21 |
|  3 | David |   21 |
|  4 | Carol |   24 |
|  5 | Bob   |   27 |
|  6 | Mike  |   29 |
|  7 | Sam   |   26 |
+----+-------+------+
7 rows in set (0.00 sec)

RAND()でランダムに行を取得する

それでは、RAND()を使ってテーブルからランダムに1行を取得してみましょう。

mysql> select * from generateRandomRow order by rand() limit 1;

実行するたびに異なる行が返されます。1回目の実行結果:

+----+------+------+
| Id | Name | Age  |
+----+------+------+
| 5  | Bob  | 27   |
+----+------+------+
1 row in set (0.00 sec)

同じクエリをもう一度実行すると、今度は別の行が表示されます。

mysql> select * from generateRandomRow order by rand() limit 1;

2回目の実行結果:

+----+------+------+
| Id | Name | Age  |
+----+------+------+
| 6  | Mike | 29   |
+----+------+------+
1 row in set (0.00 sec)

このように、クエリを実行するたびに異なるレコードがランダムに取得できていることが確認できます。

パフォーマンスに関する注意点

ORDER BY RAND() は非常に便利ですが、大規模なテーブルでは処理速度が低下する点に注意が必要です。すべての行に対して乱数を計算し、その結果をソートするため、レコード数が多いほど負荷が大きくなります。

数十万件を超えるようなテーブルで頻繁にランダム取得を行う場合は、次のような代替手段を検討すると良いでしょう。

  • IDカラムの最大値(MAX(Id))を取得し、アプリケーション側でランダムなIDを生成して WHERE 句で絞り込む方法
  • ランダムなオフセット値を算出して LIMIT句と組み合わせる方法

小〜中規模のテーブルであれば、本記事で紹介した ORDER BY RAND() の方法で十分に実用的です。用途やデータ量に応じて使い分けましょう。

  1. MySQLのSELECTステートメントで行インデックス(ランク)を生成する方法

    ROW_NUMBER()を使って行番号(ランク)を生成するMySQLでSELECTステートメントの結果に行インデックス(ランク)を付与したい場合は、ウィンドウ関数のROW_NUMBER()を使用します。この関数はPARTITION BY句と組み合わせることで、グループごとに1から順に連番を振ることができ、重複データに順位を付けたい場合に特に便利です。ここでは、重複する名前ごとにランクを割り当てる手順を具体的に見ていきましょう。まずはサンプル用のテーブルを作成します。mysql> create table DemoTable (    Name varchar(40)

  2. MySQLでSELECTクエリを使用してデータを挿入(INSERT)する方法

    MySQLでは、INSERT文とSELECTクエリを組み合わせることで、テーブルにデータを挿入することができます。通常、SELECTは既存のテーブルからデータを取得するために使われますが、値を直接指定してINSERTを実行する際にも活用できる便利な手法です。基本構文SELECTクエリを使用してINSERTを実行する場合の構文は以下の通りです。insert into yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,...N) select yourValue1,yourValue2,yourValue3,......N;