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
广告