MySQL の ForEach ループ

Mehvish Ashiq 2023年6月20日
MySQL の ForEach ループ

このチュートリアルでは、INSERTSELECTWHERE、および JOIN を 1つのステートメントで使用して、MySQL で foreach ループをシミュレートする方法について説明します。

MySQL foreach ループ

foreach ループ シミュレーションを理解するために、以下に示す名前と属性名を持つ 3つのテーブルを作成してみましょう。

テーブルとそれぞれの属性:

users -> id, user_name, person_id, email
person -> id,  person_name, address_id
address -> id, email

次のクエリを使用してテーブルを作成します。

# create `address`, `person`, and `users` tables
CREATE TABLE address(
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  email VARCHAR(45) NULL
);

CREATE TABLE person (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  person_name VARCHAR(45) NOT NULL,
  address_id INT NULL,
  FOREIGN KEY (address_id) REFERENCES address(id)
  );

CREATE TABLE users (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  user_name VARCHAR(45) NOT NULL,
  person_id INT NOT NULL,
  email VARCHAR(45) NOT NULL,
  FOREIGN KEY (person_id) REFERENCES person(id)
  );

さらに、以下の MySQL クエリを使用して、作成したばかりのテーブルにデータを挿入します。

# insert data into the `address` table. Here
# we have parenthesis only because one field
# is `auto_incremented`, and the other can accept
# `null`.
INSERT INTO address () VALUES (),(),(),();

# insert data into the `person` table
INSERT INTO person (person_name)
VALUES
('Thomas Christopher'),
('Jim James'),
('Mehvish Ashiq'),
('Saira Daniel');

# insert data into the `users` table
INSERT INTO users(user_name, person_id, email)
VALUES
('chthomas', 1, 'chthomas@yahoo.com'),
('jjames', 2, 'jimjames@gmail.com'),
('mehvishashiq', 3, 'mehvish@yahoo.com'),
('danielsaira', 4, 'sairad@gmail.com');

次に、SELECT ステートメントを使用して最近のデータを確認します。

# display data for all the specified tables
SELECT * FROM users;
SELECT * FROM person;
SELECT * FROM address;

出力 (users テーブル用):

+----+--------------+-----------+--------------------+
| id | user_name    | person_id | email              |
+----+--------------+-----------+--------------------+
|  1 | chthomas     |         1 | chthomas@yahoo.com |
|  2 | jjames       |         2 | jimjames@gmail.com |
|  3 | mehvishashiq |         3 | mehvish@yahoo.com  |
|  4 | danielsaira  |         4 | sairad@gmail.com   |
+----+--------------+-----------+--------------------+
4 rows in set (0.00 sec)

出力 (person テーブルの場合):

+----+--------------------+------------+
| id | person_name        | address_id |
+----+--------------------+------------+
|  1 | Thomas Christopher |       NULL |
|  2 | Jim James          |       NULL |
|  3 | Mehvish Ashiq      |       NULL |
|  4 | Saira Daniel       |       NULL |
+----+--------------------+------------+
4 rows in set (0.00 sec)

出力 (address テーブル用):

+----+-------+
| id | email |
+----+-------+
|  1 | NULL  |
|  2 | NULL  |
|  3 | NULL  |
|  4 | NULL  |
+----+-------+
4 rows in set (0.11 sec)

users.person_idNOT NULLperson.address_idNULL の場合、address テーブルに新しいレコードを作成することになっています。 新しく作成された行には、正確な電子メールが users.email として含まれます。

ここで、次の方法で foreach ループをシミュレートできます。

# simulation of `foreach loop`
INSERT INTO address (email) SELECT users.email
FROM users JOIN person ON users.person_id = person.id
WHERE person.address_id IS NULL;

次に、SELECT クエリを使用して、更新されたデータを確認します。

SELECT * FROM address;

出力:

+----+--------------------+
| id | email              |
+----+--------------------+
|  1 | NULL               |
|  2 | NULL               |
|  3 | NULL               |
|  4 | NULL               |
|  5 | chthomas@yahoo.com |
|  6 | jimjames@gmail.com |
|  7 | mehvish@yahoo.com  |
|  8 | sairad@gmail.com   |
+----+--------------------+
8 rows in set (0.00 sec)

ただし、カーソルとプロシージャを使用して上記のクエリを実行することもできます。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - MySQL Loop