【MySQL】別のテーブルのデータを参照してテーブルを更新する方法(UPDATE+JOIN)
MySQLでは、UPDATEコマンドとJOINを組み合わせることで、別のテーブルのデータを参照しながら、対象のテーブルを効率的に更新できます。本記事では、2つのテーブルを使った具体的なサンプルを通じて、その手順をわかりやすく解説します。
手順1:参照元のテーブルを作成する
まず、氏名データを保持する1つ目のテーブル「demo54」を作成します。
mysql> create table demo54
-> (
-> firstName varchar(20),
-> lastName varchar(20)
-> );
Query OK, 0 rows affected (0.57 sec)
続いて、INSERTコマンドでいくつかのレコードを挿入します。
mysql> insert into demo54 values('John','Smith');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo54 values('John','Smith');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo54 values('David','Smith');
Query OK, 1 row affected (0.11 sec)
SELECT文でテーブルの中身を確認してみましょう。
mysql> select *from demo54;
以下のような結果が出力されます。
+-----------+----------+
| firstName | lastName |
+-----------+----------+
| John | Smith |
| John | Smith |
| David | Smith |
+-----------+----------+
3 rows in set (0.00 sec)
手順2:更新対象のテーブルを作成する
次に、更新先となる2つ目のテーブル「demo55」を作成します。
mysql> create table demo55
-> (
-> firstName varchar(20),
-> lastName varchar(20)
-> );
Query OK, 0 rows affected (1.93 sec)
このテーブルにはfirstNameだけを挿入し、lastNameはNULLのままにしておきます。
mysql> insert into demo55 (firstName) values('John');
Query OK, 1 row affected (0.10 sec)
mysql> insert into demo55 (firstName) values('David');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo55 (firstName) values('Bob');
Query OK, 1 row affected (0.10 sec)
SELECT文で確認すると、以下のようにlastNameがすべてNULLになっています。
+-----------+----------+
| firstName | lastName |
+-----------+----------+
| John | NULL |
| David | NULL |
| Bob | NULL |
+-----------+----------+
3 rows in set (0.00 sec)
手順3:JOINを使ったUPDATE文でデータを更新する
ここからが本題です。別のテーブル(demo54)のデータをもとに、demo55のlastNameを更新するクエリは以下の通りです。
mysql> UPDATE demo55 tbl1
-> JOIN demo54 tbl2 ON tbl1.firstName = tbl2.firstName
-> set tbl1.lastName = tbl2.lastName;
Query OK, 2 rows affected (0.10 sec)
Rows matched: 2 Changed: 2 Warnings: 0
JOIN ... ONの結合条件によってfirstNameが一致する行同士が紐づけられ、tbl2(demo54)のlastNameの値がtbl1(demo55)へ代入されます。なお、demo54に存在しない「Bob」は一致する行がないため、NULLのまま変更されません。
最後にSELECT文で更新後の状態を確認しましょう。
+-----------+----------+
| firstName | lastName |
+-----------+----------+
| John | Smith |
| David | Smith |
| Bob | NULL |
+-----------+----------+
3 rows in set (0.00 sec)
まとめ
MySQLで別テーブルの値を使って既存テーブルを更新したい場合は、「UPDATE 対象テーブル エイリアス1 JOIN 参照テーブル エイリアス2 ON 結合条件 SET 更新内容」という形式を使用します。マスターテーブルの情報を一括で反映させたいケースなどで非常に便利なテクニックなので、ぜひ活用してみてください。
-
MySQLで1つのスキーマから別のスキーマへデータを挿入する方法
MySQLでは、INSERT INTO ... SELECT文を使うことで、あるデータベース(スキーマ)から別のデータベースへ簡単にデータをコピーできます。ここでは、「web」と「test」という2つのデータベースを例に、具体的な手順を解説します。 基本構文 スキーマ間でデータを挿入する際の基本構文は以下の通りです。 insert into データベース名2.テーブル名2 select *from データベース名1.テーブル名1; ポイントは、テーブル名の前に「データベース名.(ドット)」を付けることです。これにより、現在接続しているデータベースに関係なく、任意のスキーマのテーブルを指定できま
-
MySQLであるテーブルから別のテーブルへデータを挿入する方法(INSERT INTO SELECT)
MySQLであるテーブルから別のテーブルへデータをコピーして挿入したい場合は、INSERT INTO ... SELECT 文を使用します。この記事では、実際にテーブルを作成し、データを別テーブルへ移す手順をサンプルコードと実行結果とともにわかりやすく解説します。 1. 元となるテーブルを作成する まず、コピー元となるテーブル「DemoTable1」を作成します。カラムは Id(int型)と FirstName(varchar型)の2つです。 mysql> create table DemoTable1 -> ( -> Id int, -> Fi