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

MySQLクエリで連番(行番号)を生成する方法

MySQLのクエリで取得した結果セットに連番(行番号)を付与したい場合、ユーザー定義変数を活用するのが一般的な手法です。本記事では、テーブル作成から実際のクエリ実行まで、サンプルコードとともに手順をわかりやすく解説します。

連番を生成するための基本構文

MySQLクエリで連番を生成するには、以下の構文を使用します。

SELECT @変数名 := @変数名 + 1 AS 連番の別名,
       カラム名1, カラム名2, カラム名3, ...N
FROM テーブル名,
     (SELECT @変数名 := 0) AS 変数初期化用別名;

ポイントは、クロス結合したサブクエリ (SELECT @変数名 := 0) によって変数を初期化し、SELECT句の中で行が読み込まれるたびに変数を1ずつ加算している点です。

サンプルテーブルの作成

それでは、実際の動きを確認してみましょう。まずは学生情報を格納するテーブルを作成します。

mysql> CREATE TABLE tblStudentInformation
    -> (
    -> StudentName VARCHAR(20),
    -> StudentAge INT,
    -> StudentMathMarks INT
    -> );
Query OK, 0 rows affected (0.68 sec)

テストデータの挿入

次に、INSERT文を使っていくつかのレコードを挿入します。

mysql> INSERT INTO tblStudentInformation VALUES('Carol',23,89);
Query OK, 1 row affected (0.18 sec)

mysql> INSERT INTO tblStudentInformation VALUES('Bob',25,92);
Query OK, 1 row affected (0.22 sec)

mysql> INSERT INTO tblStudentInformation VALUES('John',21,82);
Query OK, 1 row affected (0.15 sec)

mysql> INSERT INTO tblStudentInformation VALUES('David',26,98);
Query OK, 1 row affected (0.21 sec)

登録データの確認

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

mysql> SELECT * FROM tblStudentInformation;

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

+-------------+------------+------------------+
| StudentName | StudentAge | StudentMathMarks |
+-------------+------------+------------------+
| Carol       |         23 |               89 |
| Bob         |         25 |               92 |
| John        |         21 |               82 |
| David       |         26 |               98 |
+-------------+------------+------------------+
4 rows in set (0.00 sec)

連番を生成するクエリの実行

いよいよ、MySQLクエリで連番を生成してみます。以下のクエリを実行してください。

mysql> SELECT @serialNumber := @serialNumber + 1 AS yourSerialNumber,
    -> StudentName, StudentAge, StudentMathMarks
    -> FROM tblStudentInformation,
    -> (SELECT @serialNumber := 0) AS serialNumber;

各行に1から始まる連番が振られた結果が表示されます。

+------------------+-------------+------------+------------------+
| yourSerialNumber | StudentName | StudentAge | StudentMathMarks |
+------------------+-------------+------------+------------------+
|                1 | Carol       |         23 |               89 |
|                2 | Bob         |         25 |               92 |
|                3 | John        |         21 |               82 |
|                4 | David       |         26 |               98 |
+------------------+-------------+------------+------------------+
4 rows in set (0.00 sec)

補足:MySQL 8.0以降ならROW_NUMBER()関数も利用可能

MySQL 8.0以降の環境では、ウィンドウ関数の ROW_NUMBER() を使う方法もおすすめです。こちらは標準SQLに準拠しており、可読性も高くなります。

SELECT ROW_NUMBER() OVER () AS yourSerialNumber,
       StudentName, StudentAge, StudentMathMarks
FROM tblStudentInformation;

OVER(ORDER BY ...) を指定すれば、任意の並び順に基づいた連番を振ることも可能です。ユーザー変数方式は旧バージョンとの互換性が必要な場合に、ROW_NUMBER() は新しい環境での開発に適しています。用途に応じて使い分けると良いでしょう。

  1. MySQLの1つのクエリで特定のレコード(重複データ)の出現回数をカウントする方法

    はじめにMySQLでテーブル内の特定のレコード(重複データ)が何回出現するかを調べたい場合、集計関数の COUNT() と GROUP BY 句を組み合わせることで、1つのクエリで簡単に実現できます。この記事では、実際にサンプルテーブルを作成し、重複データの出現回数をカウントする手順をわかりやすく解説します。サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable (    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,    

  2. MySQLでテーブル内の各レコードの出現回数をカウントし、結果を新しい列として表示する方法

    MySQLのテーブル内で同じ値が何回出現するかをカウントし、その結果を新しい列として表示したい場合があります。このような集計処理には、COUNT(*)関数とGROUP BY句を組み合わせて使用します。 サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable1942 ( Value int ); Query OK, 0 rows affected (0.00 sec) INSERTコマンドを使って、いくつかのレコードを挿入します。 mysql> insert into DemoTable