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

【MySQL】SELECTクエリ結果に行数(行番号)を値とする新しい列を追加する方法

SELECTクエリの結果に新しい列を追加し、その値として行数(行番号)を設定したい場合は、MySQLのrow_number()を使用することで実現できます。ここでは、実際にサンプルを使いながら手順を解説します。

1. テーブルの作成

まず、以下のようにテーブルを作成します。

mysql> create table DemoTable1342
-> (
-> Score int
-> );
Query OK, 0 rows affected (0.68 sec)

2. レコードの挿入

次に、INSERTコマンドを使ってテーブルにデータを登録します。

mysql> insert into DemoTable1342 values(80);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable1342 values(98);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1342 values(78);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1342 values(89);
Query OK, 1 row affected (0.07 sec)

3. 登録したデータの確認

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

mysql> select * from DemoTable1342;

実行すると、次のような出力が得られます。

+-------+
| Score |
+-------+
| 80 |
| 98 |
| 78 |
| 89 |
+-------+
4 rows in set (0.00 sec)

4. 行数を値とする新しい列を追加するクエリ

それが本題のクエリです。row_number() over()を使うことで、SELECTクエリの結果セットに対して、行数(連番)を値とする新しい列を追加できます。

mysql> select Score,row_number() over() as `Rank` from DemoTable1342 order by Score DESC;

実行結果は以下のとおりです。Scoreの降順に並べ替えられた各行に、「Rank」という名前の連番列が付与されていることが確認できます。

+-------+------+
| Score | Rank |
+-------+------+
| 98 | 1 |
| 89 | 2 |
| 80 | 3 |
| 78 | 4 |
+-------+------+
4 rows in set (0.32 sec)

補足

row_number() over()はMySQL 8.0以降で利用可能なウィンドウ関数です。このようにOVER句内にPARTITION BYやORDER BYを指定しない場合、結果セット全体に対して先頭行から順に1、2、3…と連番が採番されます。順位付けやページング処理など、さまざまな場面で活用できる便利な機能なので、ぜひ覚えておきましょう。

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

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

  2. MySQLで列が複数の値をすべて満たす行を選択する方法|GROUP BY・HAVING句の使い方

    MySQLである列が「複数の値をすべて満たしている」行だけを抽出したい場合、IN()句と GROUP BY、そして HAVING 句を組み合わせることで実現できます。この記事では、具体的なサンプルを使いながら手順をわかりやすく解説します。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここでは氏名(FirstName)と科目(Subject)を持つシンプルなテーブルを用意しました。mysql> create table DemoTable1885 ( FirstName varchar(20), Subject varchar(50)