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

MySQLでテーブルのすべての行をループ処理する方法【ストアドプロシージャの実例付き】

MySQLでテーブルのすべての行をループ処理するには

テーブル内のすべての行に対して繰り返し処理を行いたい場合は、ストアドプロシージャを使用するのが定番の方法です。本記事では、実際に動作するコード例を通じて、MySQLでテーブルの全行をループする手順をステップごとにわかりやすく解説します。

基本構文

テーブルの全行をループするためのストアドプロシージャは、以下のような構文で作成します。

delimiter //
CREATE PROCEDURE yourProcedureName()
BEGIN
DECLARE anyVariableName1 INT DEFAULT 0;
DECLARE anyVariableName2 INT DEFAULT 0;
SELECT COUNT(*) FROM yourTableName1 INTO anyVariableName1;
SET anyVariableName2 = 0;
WHILE anyVariableName2 < anyVariableName1 DO
    INSERT INTO yourTableName2(yourColumnName,...N) SELECT (yourColumnName1,...N)
FROM yourTableName1 LIMIT anyVariableName2,1;
    SET anyVariableName2 = anyVariableName2 + 1;
END WHILE;
End;
//

構文の流れを整理すると、次の3つのポイントが重要になります。

  • まず COUNT(*) で元テーブルの総行数を取得し、変数に格納します。
  • LIMIT 開始位置, 1 を使って、ループのたびに1行ずつデータを抽出・挿入します。
  • WHILE 文により、カウンタが総行数に達するまで処理を繰り返します。

それでは、理解を深めるために、元データとなる「1つ目のテーブル」と、ループ処理でデータを受け取る「2つ目のテーブル」を実際に作成してみましょう。

ステップ1:1つ目のテーブルを作成する

まず、元データとなるテーブルを作成します。以下がテーブル作成のクエリです。

mysql> create table AllRows
    -> (
    -> Id int,
    -> Name varchar(100)
    -> );
Query OK, 0 rows affected (0.46 sec)

続いて、INSERT文でサンプルレコードを挿入します。

mysql> insert into AllRows values(1,'John');
Query OK, 1 row affected (0.12 sec)

mysql> insert into AllRows values(100,'Carol');
Query OK, 1 row affected (0.13 sec)

mysql> insert into AllRows values(300,'Sam');
Query OK, 1 row affected (0.15 sec)

mysql> insert into AllRows values(400,'Mike');
Query OK, 1 row affected (0.20 sec)

SELECT文で登録内容を確認しておきましょう。

mysql> select *from AllRows;

出力結果:

+------+-------+
| Id   | Name  |
+------+-------+
|    1 | John  |
|  100 | Carol |
|  300 | Sam   |
|  400 | Mike  |
+------+-------+
4 rows in set (0.00 sec)

ステップ2:2つ目のテーブルを作成する

次に、ループ処理でデータを受け取る側のテーブルを作成します。クエリは以下の通りです。

mysql> create table SecondTableRows
   -> (
   -> StudentId int,
   -> StudentName varchar(100)
   -> );
Query OK, 0 rows affected (0.54 sec)

ステップ3:ストアドプロシージャを作成する

準備が整ったら、いよいよテーブルの全行をループするストアドプロシージャを作成します。以下がそのクエリです。

mysql> delimiter //
mysql> CREATE PROCEDURE Sp_AllRowsOfATable()
   -> BEGIN
   -> DECLARE lastRows INT DEFAULT 0;
   -> DECLARE startRows INT DEFAULT 0;
   -> SELECT COUNT(*) FROM AllRows INTO lastRows;
   -> SET startRows=0;
   -> WHILE startRows < lastRows DO
   -> INSERT INTO SecondTableRows(StudentId) SELECT (Id) FROM AllRows LIMIT
startRows ,1;
   -> SET startRows= startRows+1;
   -> END WHILE;
   -> End;
   -> //
Query OK, 0 rows affected (0.22 sec)
mysql> delimiter ;

このプロシージャでは、AllRows テーブルの総行数を取得した後、変数 startRows をオフセットとして利用し、1行ずつ SecondTableRows テーブルへ挿入しています。

ステップ4:ストアドプロシージャを実行する

作成したプロシージャは、CALL コマンドで呼び出します。基本構文は以下の通りです。

CALL yourStoredProcedureName;

それでは、先ほど作成したストアドプロシージャを実際に呼び出してみましょう。

mysql> call Sp_AllRowsOfATable();
Query OK, 1 row affected (0.61 sec)

ステップ5:結果を確認する

プロシージャ実行後、2つ目のテーブルにどのようにデータが反映されたかを確認します。

mysql> select StudentId from SecondTableRows;

出力結果:

+-----------+
| StudentId |
+-----------+
|         1 |
|       100 |
|       300 |
|       400 |
+-----------+
4 rows in set (0.00 sec)

出力を見ると、AllRows テーブルの Id 列の値(1、100、300、400)が、すべて SecondTableRowsStudentId 列へ正しくコピーされていることがわかります。このように、ストアドプロシージャとWHILE文を組み合わせれば、テーブルの全行を柔軟にループ処理できます。大量データを扱う場合や複雑な条件分岐が必要なケースでも応用できるので、ぜひ参考にしてください。

  1. MySQLでCASE文を使って条件に応じてテーブルの行の値を置き換える方法

    MySQLで条件を設定して行の値を置き換えたい場合は、CASE文を使用します。CASE文を使うことで、UPDATE文の中で各レコードの値に応じて異なる値を柔軟に設定できます。ここでは、実際にテーブルを作成し、データを挿入して、CASE文による置き換えの手順を順番に解説します。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable1481    -> (    -> PlayerScore int   &n

  2. MySQLでテーブルから順序付けられた3行のみを取得する方法

    ORDER BY句とLIMITを組み合わせて順序付きの3行を取得する MySQLでテーブルから特定の順序で並べ替えた行を、指定した件数だけ取得したい場合は、ORDER BY句とLIMITを組み合わせます。ここでは、従業員IDの降順に並べ替えた上位3行を取得する具体例を紹介します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable1551    -> (    -> EmployeeId int NOT NULL AUTO_INCREMENT PRIM