SQL - UPDATE JOIN



要使用 SQL 更新單個數據庫表中輸入的資料,可以使用 UPDATE 語句。但是,要更新多個數據庫表中的資料,我們需要使用UPDATE... JOIN子句。

例如,如果學生更改了他們的主要電話號碼並希望將其更新到他們的組織資料庫中,則需要在多個表(如學生記錄、實驗室記錄、食堂通行證等)中修改資訊。使用 JOIN 子句,您可以將所有這些表組合成一個,然後使用 UPDATE 語句,您可以同時更新其中的學生資料。

SQL UPDATE... JOIN 子句

UPDATE語句僅修改單個表中的資料,而 SQL 中的JOIN用於根據匹配欄位獲取來自多個表的行的組合。

如果我們想更新多個表中的資料,我們可以使用 JOIN 將多個表組合成一個,然後使用 UPDATE 語句更新它們。這也被稱為跨表修改。

語法

以下是 SQL UPDATE... JOIN 語句的基本語法:

UPDATE table(s)
JOIN table2 ON table1.join_column = table2.join_column
SET table1.column1 = table2.new_value1, 
    table1.column2 = table2.new_value2;

其中,JOIN可以是:常規連線、自然連線、內連線、外連線、左連線、右連線、全連線等。

示例

假設我們建立了一個名為 CUSTOMERS 的表,其中包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和薪水等,使用以下查詢:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

現在,使用 INSERT 語句將值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

該表將建立為:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

讓我們建立另一個名為 ORDERS 的表,其中包含訂單詳細資訊以及訂單日期。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 語句,將值插入此表,如下所示:

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

該表顯示如下:

OID DATE CUSTOMER_ID AMOUNT
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

以下 UPDATE... JOIN 查詢根據訂單金額上漲 500,將客戶的薪資提高 1000:

UPDATE CUSTOMERS 
JOIN ORDERS 
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID 
SET CUSTOMERS.SALARY = CUSTOMERS.SALARY + 1000, 
ORDERS.AMOUNT = ORDERS.AMOUNT + 500;

驗證

我們可以使用 SELECT 語句檢索其內容來驗證更改是否反映在表中,如下所示:

SELECT * FROM CUSTOMERS;

更新後的 CUSTOMERS 表顯示如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 2500.00
3 Kaushik 23 Kota 3000.00
4 Chaitali 25 Mumbai 7500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

現在,使用以下 SELECT 語句檢查 ORDERS 表是否已更新:

SELECT * FROM ORDERS;

更新後的 ORDERS 表顯示如下:

OID DATE CUSTOMER_ID AMOUNT
102 2009-10-08 00:00:00 3 3500.00
100 2009-10-08 00:00:00 3 2000.00
101 2009-11-20 00:00:00 2 2060.00
103 2008-05-20 00:00:00 4 2560.00

使用 WHERE 子句的 UPDATE... JOIN

在更新來自多個表的記錄時,如果我們與UPDATE... JOIN語句一起使用 WHERE 子句,我們可以過濾要更新的記錄(來自組合結果集)。

語法

MySQL 資料庫中使用 WHERE 子句的 SQL UPDATE... JOIN 語法的如下所示:

UPDATE table(s)
JOIN table2 ON column3 = column4
SET table1.column1 = value1, table1.column2 = value2, ...
WHERE condition;

示例

現在,讓我們執行以下查詢以增加客戶 ID 為3的客戶的薪資:

UPDATE CUSTOMERS 
LEFT JOIN ORDERS 
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID 
SET CUSTOMERS.SALARY = CUSTOMERS.SALARY + 1000 
WHERE ORDERS.CUSTOMER_ID = 3;

驗證

我們可以使用 SELECT 語句檢索其內容來驗證更改是否反映在表中。

SELECT * FROM CUSTOMERS;

從下表中可以看到,“Kaushik”的 SALARY 值增加了 1000:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 3000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

SQL Server 中的 UPDATE... JOIN 子句

SQL UPDATE... JOIN 子句也適用於 SQL Server 資料庫。但是,查詢的語法與 MySQL 略有不同。但是,其工作原理與 MySQL 查詢完全相同。

在 MySQL 中,UPDATE 語句後分別跟隨著 JOIN 子句和 SET 語句。而在 MS SQL Server 中,SET 語句後跟隨著 JOIN 子句。

語法

以下是 SQL Server 中UPDATE... JOIN的語法:

UPDATE tables(s)
SET column1 = value1, column2 = value2, ...
FROM table1
JOIN table2 ON table1.join_column = table2.join_column;

示例

在此示例中,我們將更新上面建立的 CUSTOMERS 和 ORDERS 表的值;使用以下 UPDATE... JOIN 查詢:

UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
FROM CUSTOMERS 
JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

驗證

我們可以使用 SELECT 語句檢索其內容來驗證更改是否反映在表中。

SELECT * FROM CUSTOMERS;

更新後的 CUSTOMERS 表顯示如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 2500.00
3 Kaushik 23 Kota 3000.00
4 Chaitali 25 Mumbai 7500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00
廣告