【初心者向け】SQLで簡単操作!あるテーブルを別のテーブルのデータで更新する方法
SQLで別のテーブルのデータを使ってテーブルを更新する方法
SQLでは、UPDATEステートメントを使って、あるテーブルのデータを別のテーブルのデータを使って更新することができます。これは、顧客情報と注文履歴を別々のテーブルに保存しているような場合などに役立ちます。
基本的な構文
UPDATE 更新対象テーブル
SET 更新対象カラム = 更新元テーブル.カラム
WHERE 更新条件;
例
顧客情報テーブル (customers
) と注文履歴テーブル (orders
) があり、顧客ID (customer_id
) で両方のテーブルが結合されている場合、以下のクエリで、orders
テーブルにある顧客の最新の注文ステータスを customers
テーブルの order_status
カラムに更新することができます。
UPDATE customers
SET order_status = (
SELECT status
FROM orders
WHERE orders.customer_id = customers.customer_id
ORDER BY order_date DESC
LIMIT 1
);
JOIN
句を使って、複数のテーブルを結合し、更新対象のレコードを特定することもできます。
上記と同じ例ですが、JOIN
句を使って書き換えると次のようになります。
UPDATE customers c
SET c.order_status = o.status
FROM customers c
JOIN orders o
ON c.customer_id = o.customer_id
ORDER BY o.order_date DESC
LIMIT 1;
副問い合わせを使って、更新対象のレコードを特定することもできます。
UPDATE customers
SET order_status = (
SELECT status
FROM orders
WHERE customer_id = customer_id
ORDER BY order_date DESC
LIMIT 1
);
注意事項
- 更新対象テーブルと更新元テーブルのカラムが同じデータ型であることを確認してください。
- 更新対象テーブルと更新元テーブルを適切に結合する必要があります。
- 副問い合わせを使って、複雑な更新処理を行うことができます。
UPDATEステートメントを使った方法
-- 顧客情報テーブルと注文履歴テーブルを作成
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
status VARCHAR(255) NOT NULL,
order_date DATE NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
-- 顧客情報と注文履歴データを挿入
INSERT INTO customers (customer_id, name) VALUES
(1, '田中 太郎'),
(2, '佐藤 花子'),
(3, '鈴木 伊藤');
INSERT INTO orders (order_id, customer_id, status, order_date) VALUES
(1, 1, 'shipped', '2024-06-01'),
(2, 1, 'pending', '2024-06-05'),
(3, 2, 'completed', '2024-06-02'),
(4, 3, 'shipped', '2024-06-03'),
(5, 3, 'pending', '2024-06-06');
-- 顧客の最新の注文ステータスを 'customers' テーブルの 'order_status' カラムに更新
UPDATE customers
SET order_status = (
SELECT status
FROM orders
WHERE orders.customer_id = customers.customer_id
ORDER BY order_date DESC
LIMIT 1
);
JOIN句を使った方法
-- 顧客の最新の注文ステータスを 'customers' テーブルの 'order_status' カラムに更新
UPDATE customers c
SET c.order_status = o.status
FROM customers c
JOIN orders o
ON c.customer_id = o.customer_id
ORDER BY o.order_date DESC
LIMIT 1;
副問い合わせを使った方法
-- 顧客の最新の注文ステータスを 'customers' テーブルの 'order_status' カラムに更新
UPDATE customers
SET order_status = (
SELECT status
FROM orders
WHERE customer_id = customer_id
ORDER BY order_date DESC
LIMIT 1
);
説明
上記のサンプルコードでは、以下の処理が行われます。
customers
テーブルとorders
テーブルを作成します。- UPDATEステートメント、JOIN句、副問い合わせのいずれかを使って、
customers
テーブルのorder_status
カラムを、各顧客の最新の注文ステータスに更新します。
- 上記のサンプルコードは、MySQLデータベースで使用することを想定しています。他のデータベース管理システムを使用している場合は、構文が多少異なる場合があります。
- サンプルコードを実行する前に、データベースに適切な権限を持っていることを確認してください。
SQLで別のテーブルのデータを使ってテーブルを更新するその他の方法
MERGE 文は、INSERT、UPDATE、DELETE の操作をまとめて実行できるステートメントです。別のテーブルのデータを使ってテーブルを更新する場合にも、MERGE 文を使用することができます。
-- 顧客の最新の注文ステータスを 'customers' テーブルの 'order_status' カラムに更新
MERGE INTO customers c
USING (
SELECT customer_id, status
FROM orders
ORDER BY order_date DESC
LIMIT 1
) o
ON c.customer_id = o.customer_id
WHEN MATCHED THEN
UPDATE SET c.order_status = o.status;
上記の例では、MERGE 文を使って、customers
テーブルと orders
テーブルを結合し、customer_id
カラムで一致するレコードを更新しています。WHEN MATCHED
節では、一致するレコードが見つかった場合に order_status
カラムを更新する処理を記述しています。
トリガーを使う
トリガー は、特定のイベントが発生したときに自動的に実行されるプログラムです。別のテーブルのデータが更新されたときに、そのデータを基に別のテーブルを更新するような処理をトリガーを使って実装することができます。
-- 注文ステータスが更新されたときに、顧客の 'order_status' カラムを更新するトリガーを作成
CREATE TRIGGER update_order_status
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
UPDATE customers
SET order_status = NEW.status
WHERE customer_id = NEW.customer_id;
END;
上記の例では、orders
テーブルの status
カラムが更新されたときに実行されるトリガーを作成しています。トリガーが実行されると、UPDATE
ステートメントを使って、customers
テーブルの order_status
カラムを、更新された status
値に更新します。
- MERGE 文とトリガーは、複雑な処理を実行する場合に役立ちますが、UPDATE ステートメントよりも処理速度が遅くなる場合があります。
- トリガーを使用する場合は、予期せぬ動作が発生しないように注意する必要があります。
上記以外にも、SQLで別のテーブルのデータを使ってテーブルを更新する方法があります。状況に応じて適切な方法を選択してください。
sql database