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() は新しい環境での開発に適しています。用途に応じて使い分けると良いでしょう。
-
MySQLの1つのクエリで特定のレコード(重複データ)の出現回数をカウントする方法
はじめにMySQLでテーブル内の特定のレコード(重複データ)が何回出現するかを調べたい場合、集計関数の COUNT() と GROUP BY 句を組み合わせることで、1つのクエリで簡単に実現できます。この記事では、実際にサンプルテーブルを作成し、重複データの出現回数をカウントする手順をわかりやすく解説します。サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-
MySQLでテーブル内の各レコードの出現回数をカウントし、結果を新しい列として表示する方法
MySQLのテーブル内で同じ値が何回出現するかをカウントし、その結果を新しい列として表示したい場合があります。このような集計処理には、COUNT(*)関数とGROUP BY句を組み合わせて使用します。 サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable1942 ( Value int ); Query OK, 0 rows affected (0.00 sec) INSERTコマンドを使って、いくつかのレコードを挿入します。 mysql> insert into DemoTable