MySQL の ROW_NUMBER()

ここでは MySQL の ROW_NUMBER() 関数ついてご説明します。

ROW_NUMBER() は MySQL の Version 8.0 以降で使える関数です。

サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。

MySQL の ROW_NUMBER() 関数の使い方

MySQL の ROW_NUMBER() 関数を使うと、現在の行の行番号を取得することができます。

クエリの結果セットに連番を振りたい時などに便利です。


使い方は ROW_NUMBER() に続けて OVER 句を指定します。

SELECT ROW_NUMBER() [OVER 句]

OVER 句では、PARTITION BY や ORDER BY などが指定できます。


たとえば、カラムA の値の降順で連番を振りたい時は次のように指定します。

SELECT ROW_NUMBER() OVER (ORDER BY カラムA DESC);

ソート順は ASC がデフォルトなので、昇順の時は指定しなくて大丈夫です。

複数のカラムでソートしたい時は、ORDER BY カラムA, カラムB, ... のように指定できます。


また、カラムX の値でグループ分けして、その中でカラム A の値の降順で連番を振りたい時は次のように指定します。

SELECT ROW_NUMBER() OVER (PARTITION BY カラムX ORDER BY カラムA DESC);

こちらも、複数のカラムでグルーピングしたい時は PARTITION BY カラムX, カラムY, ... のように指定できます。


MySQL の ROW_NUMBER() で連番を振る

それでは、実際に ROW_NUMBER() 関数を使って連番を振ってみます。

次のような students テーブルがあります。

MySQL の ROW_NUMBER() 1


ROW_NUMBER() 関数を使って、last_name, first_name の順番で連番を振るには次のようにできます。

SELECT 	ROW_NUMBER() OVER (ORDER BY last_name, first_name) AS row_no,
		student_id,
		last_name,
        first_name,
        gender
FROM 	students;

[実行結果]

MySQL の ROW_NUMBER() 2

last_name, first_name の順番で row_no に連番が振られていますね。


MySQL の ROW_NUMBER() でグループごとに連番を振る

続いて、ROW_NUMBER() 関数を使ってグループごとに連番を振ってみます。

先ほどの students テーブルのレコードを gender でグループ分けして、グループ内で last_name, first_name の順番で連番を振るには次のようにできます。

SELECT 	ROW_NUMBER() OVER (PARTITION BY gender ORDER BY last_name, first_name) AS row_no,
		student_id,
		last_name,
        first_name,
        gender
FROM 	students;

[実行結果]

MySQL の ROW_NUMBER() 3

gender でグループ分けされてから、last_name, first_name の順番で row_no に連番が振られています。


以上、MySQL の ROW_NUMBER() 関数ついてご説明しました。

© 2024 MySQL 入門