SQL:UPDATE文とJOIN句を用いて別のテーブルのデータでテーブルを更新する

2024-04-02

SQLで別のテーブルのデータを使ってテーブルを更新する方法

単純なUPDATE

UPDATE テーブル名
SET 列名 = 別テーブル名.列名
FROM テーブル名
JOIN 別テーブル名 ON テーブル名.結合条件 = 別テーブル名.結合条件;

例:customersテーブルのcity列をaddressesテーブルのcity列で更新

UPDATE customers
SET city = addresses.city
FROM customers
JOIN addresses ON customers.id = addresses.customer_id;

結合条件による更新

UPDATE テーブル名
SET 列名 = 別テーブル名.列名
FROM テーブル名
JOIN 別テーブル名 ON テーブル名.結合条件 = 別テーブル名.結合条件
WHERE テーブル名.条件;
UPDATE customers
SET city = addresses.city
FROM customers
JOIN addresses ON customers.id = addresses.customer_id
WHERE customers.state = 'CA';

サブクエリによる更新

UPDATE テーブル名
SET 列名 = (SELECT 列名 FROM 別テーブル名 WHERE 条件);
FROM テーブル名;
UPDATE customers
SET city = (SELECT city FROM addresses ORDER BY population DESC LIMIT 1);
FROM customers;

注意点

  • 更新対象のレコードが正しく選択されていることを確認する。
  • 結合条件やWHERE条件を誤ると、意図しないデータが更新される可能性がある。
  • テスト環境で動作確認してから本番環境で実行する。



単純なUPDATE

-- テーブル作成
CREATE TABLE customers (
  id INT,
  name VARCHAR(255),
  city VARCHAR(255)
);

INSERT INTO customers (id, name, city) VALUES (1, 'John Doe', 'Tokyo');
INSERT INTO customers (id, name, city) VALUES (2, 'Jane Doe', 'Osaka');

CREATE TABLE addresses (
  id INT,
  customer_id INT,
  city VARCHAR(255)
);

INSERT INTO addresses (id, customer_id, city) VALUES (1, 1, 'New York');
INSERT INTO addresses (id, customer_id, city) VALUES (2, 2, 'London');

-- データ更新
UPDATE customers
SET city = addresses.city
FROM customers
JOIN addresses ON customers.id = addresses.customer_id;

-- 結果確認
SELECT * FROM customers;

-- 結果
-- id | name      | city
-- -- | -------- | --------
-- 1  | John Doe  | New York
-- 2  | Jane Doe  | London

結合条件による更新

-- テーブル作成
CREATE TABLE customers (
  id INT,
  name VARCHAR(255),
  city VARCHAR(255),
  state VARCHAR(255)
);

INSERT INTO customers (id, name, city, state) VALUES (1, 'John Doe', 'Tokyo', 'CA');
INSERT INTO customers (id, name, city, state) VALUES (2, 'Jane Doe', 'Osaka', 'NY');

CREATE TABLE addresses (
  id INT,
  customer_id INT,
  city VARCHAR(255)
);

INSERT INTO addresses (id, customer_id, city) VALUES (1, 1, 'New York');
INSERT INTO addresses (id, customer_id, city) VALUES (2, 2, 'London');

-- データ更新
UPDATE customers
SET city = addresses.city
FROM customers
JOIN addresses ON customers.id = addresses.customer_id
WHERE customers.state = 'CA';

-- 結果確認
SELECT * FROM customers;

-- 結果
-- id | name      | city        | state
-- -- | -------- | -------- | --------
-- 1  | John Doe  | New York  | CA
-- 2  | Jane Doe  | Osaka     | NY

サブクエリによる更新

-- テーブル作成
CREATE TABLE customers (
  id INT,
  name VARCHAR(255),
  city VARCHAR(255)
);

INSERT INTO customers (id, name, city) VALUES (1, 'John Doe', 'Tokyo');
INSERT INTO customers (id, name, city) VALUES (2, 'Jane Doe', 'Osaka');

CREATE TABLE addresses (
  id INT,
  city VARCHAR(255),
  population INT
);

INSERT INTO addresses (id, city, population) VALUES (1, 'New York', 1000000);
INSERT INTO addresses (id, city, population) VALUES (2, 'London', 8000000);

-- データ更新
UPDATE customers
SET city = (SELECT city FROM addresses ORDER BY population DESC LIMIT 1);
FROM customers;

-- 結果確認
SELECT * FROM customers;

-- 結果
-- id | name      | city
-- -- | -------- | --------
-- 1  | John Doe  | London
-- 2  | Jane Doe  | London



INSERT INTO ... SELECT ...

-- テーブル作成
CREATE TABLE customers (
  id INT,
  name VARCHAR(255),
  city VARCHAR(255)
);

INSERT INTO customers (id, name) VALUES (1, 'John Doe');
INSERT INTO customers (id, name) VALUES (2, 'Jane Doe');

CREATE TABLE addresses (
  id INT,
  customer_id INT,
  city VARCHAR(255)
);

INSERT INTO addresses (id, customer_id, city) VALUES (1, 1, 'New York');
INSERT INTO addresses (id, customer_id, city) VALUES (2, 2, 'London');

-- データ更新
INSERT INTO customers (city)
SELECT addresses.city
FROM customers
JOIN addresses ON customers.id = addresses.customer_id;

-- 結果確認
SELECT * FROM customers;

-- 結果
-- id | name      | city
-- -- | -------- | --------
-- 1  | John Doe  | New York
-- 2  | Jane Doe  | London

MERGE INTO (Oracle)

-- テーブル作成
CREATE TABLE customers (
  id INT,
  name VARCHAR(255),
  city VARCHAR(255)
);

INSERT INTO customers (id, name) VALUES (1, 'John Doe');
INSERT INTO customers (id, name) VALUES (2, 'Jane Doe');

CREATE TABLE addresses (
  id INT,
  customer_id INT,
  city VARCHAR(255)
);

INSERT INTO addresses (id, customer_id, city) VALUES (1, 1, 'New York');
INSERT INTO addresses (id, customer_id, city) VALUES (2, 2, 'London');

-- データ更新
MERGE INTO customers c
USING addresses a ON (c.id = a.customer_id)
WHEN MATCHED THEN
  UPDATE SET c.city = a.city;

-- 結果確認
SELECT * FROM customers;

-- 結果
-- id | name      | city
-- -- | -------- | --------
-- 1  | John Doe  | New York
-- 2  | Jane Doe  | London

UPSERT (MySQL)

-- テーブル作成
CREATE TABLE customers (
  id INT,
  name VARCHAR(255),
  city VARCHAR(255)
);

INSERT INTO customers (id, name) VALUES (1, 'John Doe');
INSERT INTO customers (id, name) VALUES (2, 'Jane Doe');

CREATE TABLE addresses (
  id INT,
  customer_id INT,
  city VARCHAR(255)
);

INSERT INTO addresses (id, customer_id, city) VALUES (1, 1, 'New York');
INSERT INTO addresses (id, customer_id, city) VALUES (2, 2, 'London');

-- データ更新
INSERT INTO customers (id, name, city)
VALUES (1, 'John Doe', 'New York')
ON DUPLICATE KEY UPDATE city = VALUES(city);

-- 結果確認
SELECT * FROM customers;

-- 結果
-- id | name      | city
-- -- | -------- | --------
-- 1  | John Doe  | New York
-- 2  | Jane Doe  | London

それぞれの特徴を理解して、状況に応じて適切な方法を選択してください。


sql oracle sql-update


SQLクエリにおける改行:可読性と理解しやすさを向上させる方法

可読性の向上クエリを複数行に分割することで、可読性を向上させることができます。特に、長い複雑なクエリの場合に有効です。改行は、WHERE句、ORDER BY句、GROUP BY句などの主要なク句の後に挿入するのが一般的です。コメントの挿入-- 記号を使用して、クエリ内にコメントを挿入することができます。コメントは、クエリの実行には影響を与えず、コードを理解しやすくするために使用されます。...


JavaでH2メモリ内データベースのスキーマ自動生成

JavaでH2メモリ内データベースを利用する場合、スキーマを事前に定義する必要はありません。H2は、インメモリデータベースに自動スキーマ作成機能を備えており、アプリケーションで初めてデータ操作を実行した際に、スキーマを自動的に生成します。この機能は、開発の生産性を向上させるだけでなく、スキーマの変更を容易にするという利点があります。...


SQLにおけるCROSS JOINとINNER JOINの詳細解説と応用例:プログラミング初心者向け

SQLで複数のテーブルを結合する際、最も基本的な操作が「JOIN」です。JOINには様々な種類がありますが、中でもよく使われるのが「CROSS JOIN」と「INNER JOIN」です。一見似ているように見えますが、全く異なる結果を返します。...


正規表現で Django モデルを強化:django-regex-field パッケージの使い方

Django で正規表現フィールドを使用するには、以下の手順が必要です。モデルに RegexField を追加する:この例では、my_field フィールドは、英数字とアンダースコアのみを含む文字列のみを保存します。フィールドにフラグを指定する (オプション):...


稼働日数の計算を自動化:UDFと生成法を活用した効率的なアプローチ

ここでは、SQLとMariaDBを使用して、2つの日付間の稼働日数を数える方法を2つの方法で詳しく説明します。方法 1:除外法この方法は、まず期間内のすべての日にちをカウントし、その後、休日と週末を除外することで稼働日数を求めます。このクエリは、以下の3つのテーブルを使用します。...