MySQL 複数テーブルを JOIN してデータを更新 (UPDATE)

ここでは MySQL で複数のテーブルを JOIN してデータを更新 (UPDATE) する方法をご説明します。

サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。

MySQL の UPDATE ... JOIN 文の使い方

MySQL でテーブルのデータを更新するには UPDATEJOIN を使います。

基本の UPDATE の構文は以下の通りでした。

UPDATE  テーブル1
SET     カラム名1 = 値1,
        カラム名2 = 値2,
        カラム名3 = 値3,
        ...
WHERE   条件文;

複数のテーブルを使って更新したい時、MySQL ではテーブルの結合 (JOIN) は、UPDATE の後、SET の前に追加します。

例えば、テーブル1 と テーブル2 を id というカラムで INNER JOIN して、テーブル1 のデータを更新したいのであれば次のようにできます。

UPDATE 	テーブル1 AS t1
			INNER JOIN テーブル2 AS t2
				ON t1.id = t2.id
SET     t1.カラム名1 = 値1,
        t1.カラム名2 = 値2,
        t1.カラム名3 = 値3,
        ...
WHERE   条件文;

テーブルのエイリアスは必須ではありませんが、クエリーが読みやすくなるのでつけています。


UPDATE 文で複数のテーブルを JOIN してデータを更新する

それでは、実際にサンプルデータを使ってテーブルを結合して値を更新してみましょう。

次のような、students, exams, exam_results テーブがあり、データは以下のような状態です。

MySQL 複数テーブルを JOIN して更新 (UPDATE) 1

MySQL 複数テーブルを JOIN して更新 (UPDATE) 2

MySQL 複数テーブルを JOIN して更新 (UPDATE) 3


ここで、「数学1」の「男性」の学生の「スコア」を 1 点ずつ追加したいとします。

「数学1」は exams テーブルの exam_name_jp カラム、「男性」は students テーブルの gender、更新したいのは exam_results テーブルの score です。


間違いがないようにおすすめなのは、まず更新の対象となるデータの SELECT 文を書いてみることです。

SELECT 	*
FROM 	exam_results AS er
			INNER JOIN exams AS e
				ON er.exam_id = e.exam_id
			INNER JOIN students AS s
				ON er.student_id = s.student_id
WHERE   e.exam_name_jp = '数学1'
        AND s.gender = 'M';

クエリーを実行して、更新したい対象のデータが取得できているか確認します。

MySQL 複数テーブルを JOIN して更新 (UPDATE) 4


更新したい対象のデータが取得できていれば、この SELECT文を元に UPDATE 文を作ります。

SELECT から FROM までの部分が UPDATE になって、WHERE の前に SET 句が入ります。

UPDATE	exam_results AS er
			INNER JOIN exams AS e
				ON er.exam_id = e.exam_id
			INNER JOIN students AS s
				ON er.student_id = s.student_id
SET     er.score = er.score + 1
WHERE   e.exam_name_jp = '数学1'
        AND s.gender = 'M';

上の UPDATE 文を実行して、もう一度上の SELECT 文を実行してテーブルの中身を確認します。

MySQL 複数テーブルを JOIN して更新 (UPDATE) 5

UPDATE 文で 2 レコード更新されて、「数学1」の「男性」の学生の score が 1 点ずつ追加されていますね。


以上、MySQL で複数のテーブルを JOIN してデータを更新 (UPDATE) する方法をご説明しました。

© 2024 MySQL 入門