MySQLで別のテーブルの値を使ってテーブルを更新する方法(INNER JOINの活用)
MySQLでは、INNER JOINを組み合わせることで、別のテーブルに格納されている値を参照しながら、対象のテーブルを更新することができます。本記事では、2つのサンプルテーブルを作成し、実際にUPDATE文を実行して動作を確認していきます。
1つ目のテーブルを作成する
まずは更新元となるデータを持つテーブル「tblFirst」を作成します。
mysql> CREATE table tblFirst -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.48 sec)
tblFirstへレコードを挿入する
作成したテーブルに3件のレコードを登録します。
mysql> INSERT into tblFirst values(1,'John'); Query OK, 1 row affected (0.17 sec) mysql> INSERT into tblFirst values(2,'Bob'); Query OK, 1 row affected (0.26 sec) mysql> INSERT into tblFirst values(3,'David'); Query OK, 1 row affected (0.20 sec)
tblFirstの全レコードを確認する
mysql> SELECT * from tblFirst;
実行結果は以下の通りです。
+------+-------+ | id | name | +------+-------+ | 1 | John | | 2 | Bob | | 3 | David | +------+-------+ 3 rows in set (0.00 sec)
2つ目のテーブルを作成する
次に、更新対象となるテーブル「UpdTable」を作成します。ここでは自動採番用のカラム「IncId」を主キーとして設定しています。
mysql> CREATE table UpdTable -> ( -> IncId int auto_increment, -> primary key(IncId), -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.57 sec)
UpdTableへレコードを挿入する
4件のレコードを登録します。最後のレコード「john」に注目してください。この名前は1つ目のテーブル「tblFirst」に存在する名前と一致しています。
mysql> INSERT into UpdTable(id,name) values(1,'Taylor'); Query OK, 1 row affected (0.12 sec) mysql> INSERT into UpdTable(id,name) values(2,'jason'); Query OK, 1 row affected (0.24 sec) mysql> INSERT into UpdTable(id,name) values(3,'carol'); Query OK, 1 row affected (0.14 sec) mysql> INSERT into UpdTable(id,name) values(4,'john'); Query OK, 1 row affected (0.16 sec)
UpdTableの全レコードを確認する
mysql> SELECT * from UpdTable;
実行結果は以下の通りです。
+-------+------+--------+ | IncId | id | name | +-------+------+--------+ | 1 | 1 | Taylor | | 2 | 2 | jason | | 3 | 3 | carol | | 4 | 4 | john | +-------+------+--------+ 4 rows in set (0.00 sec)
上記の出力を見ると、最終行の「john」は1つ目のテーブルのレコードと名前が一致していることがわかります。
INNER JOINを使ったUPDATE文を実行する
それでは、「name」カラムを結合条件として、tblFirstのidの値でUpdTableのidを更新するクエリを書いてみましょう。
mysql> UPDATE UpdTable -> inner join tblFirst ON (UpdTable.name = tblFirst.name) -> SET UpdTable.id = tblFirst.id; Query OK, 1 row affected (0.19 sec) Rows matched: 1 Changed: 1 Warnings: 0
更新結果を確認する
更新後のデータをSELECT文で確認してみます。
mysql> SELECT * from UpdTable;
実行結果は以下の通りです。
+-------+------+--------+ | IncId | id | name | +-------+------+--------+ | 1 | 1 | Taylor | | 2 | 2 | jason | | 3 | 3 | carol | | 4 | 1 | john | +-------+------+--------+ 4 rows in set (0.00 sec)
出力結果をご覧ください。最終行のidが4から1に更新されました。これは、「john」という名前がtblFirstテーブル内ではid=1として登録されていたためです。
まとめ
このように、UPDATE文とINNER JOINを組み合わせることで、他のテーブルの値を条件や代入元として利用した柔軟な更新処理が可能になります。マスターテーブルの情報をもとにトランザクションテーブルを一括修正したい場合など、実務でも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。
-
【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 (
-
MySQLのINSERT INTO SELECT文で別のテーブルの値を挿入する方法
あるテーブルの値を基に別のテーブルへデータを挿入したい場合は、INSERT INTO SELECT文を使用します。この構文では、SELECT文で抽出した結果セットをそのまま対象テーブルへ流し込めるため、テーブル間のデータ移行やコピーにもっとも効率的な方法の一つです。 以下の手順で、実際の動作を順番に確認していきましょう。 手順1:元となるテーブルを作成する まず、データのコピー元となるテーブル「demo82」を作成します。 mysql> create table demo82 -> (