SQL UPDATE with JOINによる複数テーブルの更新

別テーブルの値に基づいて行を更新するSQL UPDATE with JOINの方法を学びます。PostgreSQLとMySQLの構文の違いも解説します。

DML

詳細な説明

SQL UPDATE with JOINによる複数テーブルの更新

別テーブルのデータに基づいて行を更新することは一般的な要件です。構文はデータベースシステムによって異なりますが、概念は同じです。

PostgreSQLの構文

UPDATE orders o
SET status = 'vip_order',
    discount = 0.15
FROM customers c
WHERE o.customer_id = c.id
  AND c.tier = 'VIP';

PostgreSQLでは FROM 句で追加テーブルを結合します。

MySQLの構文

UPDATE orders o
INNER JOIN customers c ON o.customer_id = c.id
SET o.status = 'vip_order',
    o.discount = 0.15
WHERE c.tier = 'VIP';

MySQLではJOINをUPDATE文の中に直接記述します。

SQL Serverの構文

UPDATE o
SET o.status = 'vip_order',
    o.discount = 0.15
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
WHERE c.tier = 'VIP';

サブクエリによる更新(標準SQL)

UPDATE orders
SET discount = 0.15
WHERE customer_id IN (
  SELECT id FROM customers WHERE tier = 'VIP'
);

このアプローチはすべてのデータベースシステムで動作しますが、複雑な条件の場合はより低速になる場合があります。

集約値による更新

UPDATE products p
SET avg_rating = sub.avg_rating
FROM (
  SELECT product_id, AVG(rating) AS avg_rating
  FROM reviews
  GROUP BY product_id
) sub
WHERE p.id = sub.product_id;

安全上の注意

  • 必ずWHERE句を使用すること。 WHERE句のないUPDATEはテーブルのすべての行を変更する
  • まずSELECTでテスト: UPDATE ... SETSELECT に置き換えて、影響を受ける行をプレビューする
  • トランザクションを使用: 更新を BEGIN/COMMIT で囲み、問題があれば ROLLBACK できるようにする
  • 行数を確認: 更新後、影響を受けた行数が予想と一致するか確認する
  • 一括更新前にバックアップ: 重要なテーブルでは、大量更新前にバックアップまたはスナップショットを作成する

UPDATE with JOINは、関連テーブル間でデータを同期し、外部条件に基づいた条件付き変更を適用するための強力なパターンです。

ユースケース

注文管理システムが、別のcustomersテーブルに格納された顧客ティアに基づいて、JOINを使ったUPDATE文でVIP割引を注文レコードに適用する場面。

Try It — SQL Formatter

フルツールを開く