0Pricing
SQL Academy · レッスン

FROMとJOIN形式のUPDATE

UPDATE ... FROM(PostgreSQL)と標準のMERGEステートメントを使い、別のテーブルの値で行を更新します。

「FROMとJOIN形式のUPDATE」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

基本的なUPDATE

条件に一致する行の値を変更します。

UPDATE users SET full_name = 'Alice Adams' WHERE id = 1;

複数の列

SET句をカンマ区切りで指定します。

UPDATE users
SET full_name = 'Alice', last_login = NOW(), visits = visits + 1
WHERE id = 1;

多数の行のUPDATE

WHEREでより多くの行に一致させるだけです。

UPDATE orders SET status = 'archived'
WHERE created_at < NOW() - INTERVAL '5 years';

サブクエリを使ったUPDATE

別のクエリの結果から新しい値を計算します。

UPDATE products
SET review_count = (
  SELECT COUNT(*) FROM reviews WHERE reviews.product_id = products.id
);

UPDATE … FROM(PostgreSQL)

JOINのようなUPDATEで、別のテーブルから値を取得します。

UPDATE products p
SET stock = i.qty
FROM inventory i
WHERE i.product_id = p.id;

複数のテーブルを使ったUPDATE … FROM

FROMリストには複数のテーブルを含めることができます。

UPDATE invoices inv
SET tax_rate = r.rate
FROM users u
JOIN rates r ON r.country = u.country
WHERE inv.user_id = u.id;

標準SQL:相関サブクエリを使ったUPDATE … FROM

移植性のある同等の方法です(低速です)。

UPDATE products p
SET stock = (SELECT qty FROM inventory i WHERE i.product_id = p.id);

INSERT/UPDATE/DELETEのためのMERGE

PostgreSQL 15以降では、複合操作用のMERGEをサポートしています。UPSERTのレッスンを参照してください。

UPDATEでのRETURNING

1回のラウンドトリップで、更新された行を取得します。

UPDATE orders SET status = 'shipped', shipped_at = NOW()
WHERE id = $1
RETURNING id, status, shipped_at;

CASEを使ったUPDATE

条件に応じて新しい値を設定します。

UPDATE orders
SET status = CASE
  WHEN paid_at IS NOT NULL THEN 'paid'
  WHEN created_at < NOW() - INTERVAL '24h' THEN 'expired'
  ELSE status
END;

WHEREの付け忘れに注意

UPDATE users SET active = false;はすべての行をUPDATEします。本番環境では、次のようにしてください。

  • 先にSELECTを実行して、行数を確認します
  • トランザクションで囲み、COMMITの前に確認します
  • BEGIN; ...; SELECT count(*) FROM users WHERE active = false; ROLLBACK;をドライランとして使用します

UPDATEのパフォーマンス

UPDATEは新しい行バージョンを作成し、古いバージョンを不要としてマークします(MVCC)。頻繁にUPDATEされるテーブルは肥大化する可能性があります。詳しくはVACUUM/MVCCのレッスンで説明します。

まとめ

UPDATE … FROMは、複数行の修正を分かりやすく行えるJOIN形式のUPDATEです。

  • 必ずWHEREを指定します。決して忘れないでください
  • RETURNINGを使って確認します
  • ROLLBACKを使うトランザクションでテストします

理解度チェック

PostgreSQLで別のテーブルを参照できるUPDATE構文はどれですか。

よくある質問

「FROMとJOIN形式のUPDATE」レッスンは無料ですか?

はい。「FROMとJOIN形式のUPDATE」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「FROMとJOIN形式のUPDATE」で何を学びますか?

UPDATE ... FROM(PostgreSQL)と標準のMERGEステートメントを使い、別のテーブルの値で行を更新します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「FROMとJOIN形式のUPDATE」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 複数行のINSERT
  2. UPSERT:ON CONFLICT DO UPDATE(PostgreSQL)
  3. FROMとJOIN形式のUPDATE
  4. USING付きDELETEと安全なパターン
← SQL Academyに戻る