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

MySQLのROW_NUMBER()関数とは?行に連番を振る方法を実例付きで解説

ROW_NUMBER()は、MySQL 8.0から利用可能になったウィンドウ関数の一種です。この関数を使うと、クエリ結果の各行に対して連番(シーケンス番号)を割り当てることができます。ランキングの作成やページネーション処理など、さまざまな場面で活躍する便利な関数です。

ここでは、実際にテーブルを作成しながら、ROW_NUMBER()の基本的な使い方を順番に見ていきましょう。

1. テーブルの作成

まず、CREATEコマンドを使ってサンプル用のテーブルを作成します。

mysql> CREATE table rowNumberDemo
-> (
-> FirstName varchar(100)
-> );
Query OK, 0 rows affected (0.92 sec)

「FirstName」というカラムを1つだけ持つシンプルなテーブル「rowNumberDemo」が作成されました。

2. レコードの挿入

次に、INSERT文を使って複数のレコードを挿入します。

mysql> INSERT into rowNumberDemo values('john');
Query OK, 1 row affected (0.17 sec)

mysql> INSERT into rowNumberDemo values('john');
Query OK, 1 row affected (0.29 sec)

mysql> INSERT into rowNumberDemo values('Bob');
Query OK, 1 row affected (0.13 sec)

mysql> INSERT into rowNumberDemo values('Smith');
Query OK, 1 row affected (0.17 sec)

同じ名前「john」を意図的に2件登録している点に注目してください。ROW_NUMBER()は重複した値でもそれぞれ別の連番を振るため、この挙動を確認するのに適しています。

3. 登録データの確認

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

mysql> SELECT * from rowNumberDemo;

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

+-----------+
| FirstName |
+-----------+
| john      |
| john      |
| Bob       |
| Smith     |
+-----------+
4 rows in set (0.00 sec)

4件のレコードが登録されていることが確認できます。

4. ROW_NUMBER()で連番を振る

それでは本題のROW_NUMBER()を使ってみましょう。以下のようにOVER句とORDER BY句を組み合わせることで、各レコードに対して昇順の連番を割り当てられます。

mysql> SELECT row_number() over ( order by firstName) RowNumberSequence,
    -> FirstName
    -> from rowNumberDemo
    -> order by FirstName;

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

+-------------------+-----------+
| RowNumberSequence | FirstName |
+-------------------+-----------+
| 1                 | Bob       |
| 2                 | john      |
| 3                 | john      |
| 4                 | Smith     |
+-------------------+-----------+
4 rows in set (0.00 sec)

実行結果のポイント

出力結果を見ると、row_number()によってすべてのレコードに1から始まる連番が割り当てられていることがわかります。

  • ORDER BY句でfirstNameを指定しているため、名前のアルファベット順(Bob → john → john → Smith)に並んでいます。
  • 重複している「john」にも、それぞれ別々の番号(2と3)が振られています。これはROW_NUMBER()が同順位を作らず、必ず一意の連番を返すためです。

まとめ

MySQL 8.0以降で使えるROW_NUMBER()は、ウィンドウ関数の一種であり、クエリ結果の各行に簡単に連番を付与できる強力な機能です。基本構文は以下のようになります。

SELECT row_number() OVER (ORDER BY カラム名) AS 連番名, ...
FROM テーブル名;

同点を許さず必ず一意の番号を付けたい場合や、グループごと(PARTITION BY句を使用)に採番したい場合などにも対応できるため、ランキング処理やデータ分析の場面でぜひ活用してみてください。

  1. MySQLの「SELECT TRUE」とは?意味と使い方を解説

    MySQLにおける「SELECT TRUE」の基本MySQLでは、SELECT TRUEというステートメントを実行すると、条件に一致する行ごとに「1」が返されます。これは、MySQLにおいてTRUE(真)という論理値が内部的に整数の「1」として扱われているためです。逆にFALSE(偽)は「0」に相当します。この記事では、実際にテーブルを作成し、SELECT TRUEがどのような結果を返すのかを具体的な例で確認していきます。検証用テーブルの作成まず、以下のコマンドでサンプルテーブルを作成します。mysql> create table DemoTable(Name varchar(100))

  2. MySQLの@@identityとは?最後に挿入されたAUTO_INCREMENT値を取得する方法

    MySQLにおける@@identityとは @@identityは、現在のセッション内でAUTO_INCREMENTカラムに最後に挿入された値を返すシステム変数です。新規レコード追加後に、自動採番されたIDをすぐに取得したい場合などに活用できます。ここでは、実際にテーブルを作成して動作を確認してみましょう。 1. テーブルの作成 まず、以下のコマンドでサンプル用のテーブルを作成します。 mysql> create table DemoTable(     UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY