MySQL 複数テーブルを JOIN してデータを更新 (UPDATE)
ここでは MySQL で複数のテーブルを JOIN してデータを更新 (UPDATE) する方法をご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の UPDATE ... JOIN 文の使い方
MySQL でテーブルのデータを更新するには UPDATE と JOIN を使います。
基本の 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 テーブがあり、データは以下のような状態です。
ここで、「数学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';
クエリーを実行して、更新したい対象のデータが取得できているか確認します。
更新したい対象のデータが取得できていれば、この 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 文を実行してテーブルの中身を確認します。
UPDATE 文で 2 レコード更新されて、「数学1」の「男性」の学生の score が 1 点ずつ追加されていますね。
以上、MySQL で複数のテーブルを JOIN してデータを更新 (UPDATE) する方法をご説明しました。