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

MySQLでランダムな行・複数のランダムな行を取得する方法|RAND()関数の使い方を解説

MySQLでテーブルからランダムな行を取得したい場合には、RAND()関数を使用します。ORDER BY句とLIMIT句を組み合わせることで、ランダムに並べ替えた結果の中から、必要な件数だけ自由に抽出できます。

基本構文

ランダムな行を取得するための基本的な構文は以下の通りです。

SELECT * FROM yourTableName ORDER BY RAND() LIMIT yourIntegerNumber;
  • ORDER BY RAND():各行に対して乱数を発生させ、その値をもとに結果をランダムに並べ替えます。
  • LIMIT 行数:並べ替えた結果から、指定した件数だけ行を取得します。

それでは、実際にサンプルを使って動作を確認していきましょう。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成します。以下のクエリを実行してください。

mysql> create table gettingRandomRow
-> (
-> CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CustomerName varchar(100)
-> );
Query OK, 0 rows affected (0.45 sec)

このテーブルには、自動採番される「CustomerId」と顧客名を格納する「CustomerName」の2つのカラムがあります。

テストデータの挿入

次に、INSERT文を使って顧客データを13件登録します。

mysql> insert into gettingRandomRow(CustomerName) values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Robert');
Query OK, 1 row affected (0.10 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Ramit');
Query OK, 1 row affected (0.15 sec)
mysql> insert into gettingRandomRow(CustomerName) values('James');
Query OK, 1 row affected (0.11 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Mike');
Query OK, 1 row affected (0.15 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Sam');
Query OK, 1 row affected (0.17 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Carol');
Query OK, 1 row affected (0.11 sec)
mysql> insert into gettingRandomRow(CustomerName) values('David');
Query OK, 1 row affected (0.16 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Maxwell');
Query OK, 1 row affected (0.14 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Larry');
Query OK, 1 row affected (0.13 sec)
mysql> insert into gettingRandomRow(CustomerName) values('John');
Query OK, 1 row affected (0.11 sec)

登録データの確認

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

mysql> select *from gettingRandomRow;

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

+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 1 | Chris |
| 2 | Robert |
| 3 | Ramit |
| 4 | James |
| 5 | Jace |
| 6 | Mike |
| 7 | Sam |
| 8 | Bob |
| 9 | Carol |
| 10 | David |
| 11 | Maxwell |
| 12 | Larry |
| 13 | John |
+------------+--------------+
13 rows in set (0.00 sec)

13件のレコードが登録されていることが確認できました。ここから、ランダムな行を取得するクエリを見ていきます。

ランダムな行を取得するクエリ例

ケース1:ランダムな行を1件取得する

LIMITに「1」を指定すると、ランダムな行を1件だけ取得できます。

mysql> select *from gettingRandomRow order by rand() LIMIT 1;

実行結果:

+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 13 | John |
+------------+--------------+
1 row in set (0.00 sec)

ケース2:ランダムな行を2件取得する

LIMITに「2」を指定すれば、ランダムな行を2件取得できます。

mysql> select *from gettingRandomRow order by rand() LIMIT 2;

実行結果:

+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 2 | Robert |
| 3 | Ramit |
+------------+--------------+
2 rows in set (0.00 sec)

ケース3:同じクエリでも結果は毎回変わる

同じクエリを再度実行すると、今度はまったく別の組み合わせの行が返されます。これがRAND()によるランダム抽出の特徴です。

mysql> select *from gettingRandomRow order by rand() LIMIT 2;

実行結果:

+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 4 | James |
| 9 | Carol |
+------------+--------------+
2 rows in set (0.00 sec)

注意点:大量データではパフォーマンスに留意

ORDER BY RAND()は、テーブル内のすべての行に対して乱数を計算し、その結果をソートする仕組みです。そのため、レコード数が少ないうちは問題ありませんが、数十万件・数百万件といった大規模なテーブルでは処理速度が大幅に低下する可能性があります。

大規模テーブルでランダム取得が必要な場合は、「主キーの最小値と最大値の間で乱数を生成し、該当する行を個別に取得する」「あらかじめランダム順のカラムを持たせておく」などの代替手法を検討するとよいでしょう。

まとめ

  • MySQLでランダムな行を取得するには、ORDER BY RAND() と LIMIT を組み合わせるのが最もシンプルな方法。
  • LIMITの数値を変えることで、取得する行数を自由に指定できる。
  • 実行するたびに異なる行が返されるため、くじ引きやおすすめ表示などに活用できる。
  • ただし全行ソートが発生するため、大規模テーブルではパフォーマンスに注意が必要。
  1. MySQLでクエリ結果をランダムに並べ替え、ランダムな行を選択する方法

    MySQLでクエリの結果をランダムに並べ替えたい場合は、ORDER BY RAND() を使用します。WHERE句で絞り込んだ結果に対してランダムな順序を適用し、LIMIT句と組み合わせることで、指定した件数の行をランダムに取得できます。基本構文select * from DemoTable1559 where yourColumnName IN(yourValue1,yourValue2,....N) order by rand() limit yourLimitValue;サンプルテーブルの作成まずは動作確認用のテーブルを作成しましょう。mysql> create table Dem

  2. MySQLでテーブルから特定の行を抽出するクエリの書き方

    MySQLでは、WHERE句とORDER BY、LIMITを組み合わせることで、テーブルから条件に合致する特定の行だけを効率的に取得できます。本記事では、実際にサンプルテーブルを作成し、特定の行を抽出するクエリの実行手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、CREATE TABLE文を使ってサンプル用のテーブルを作成します。ここでは「Section(組)」と「StudentName(生徒名)」という2つのカラムを持つテーブルを用意しました。 mysql> create table DemoTable1972 ( Section char(1),