【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…と連番が採番されます。順位付けやページング処理など、さまざまな場面で活用できる便利な機能なので、ぜひ覚えておきましょう。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
MySQLで列が複数の値をすべて満たす行を選択する方法|GROUP BY・HAVING句の使い方
MySQLである列が「複数の値をすべて満たしている」行だけを抽出したい場合、IN()句と GROUP BY、そして HAVING 句を組み合わせることで実現できます。この記事では、具体的なサンプルを使いながら手順をわかりやすく解説します。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここでは氏名(FirstName)と科目(Subject)を持つシンプルなテーブルを用意しました。mysql> create table DemoTable1885 ( FirstName varchar(20), Subject varchar(50)