摘要:在本教程中,您将学习如何使用MySQL UPDATE JOIN语句来执行跨表更新。我们将逐步向您展示如何在UPDATE
语句中使用INNER JOIN
子句和LEFT JOIN
子句。
MySQL UPDATE JOIN 语法
您经常使用联接来查询表中的行,这些行在另一个表中具有(在INNER JOIN
的情况下)或可能没有(在LEFT JOIN
的情况下)匹配的行。在MySQL中,可以使用UPDATE
语句中的JOIN
子句来执行跨表更新。
MySQL UPDATE JOIN
的语法如下:
UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition
Code language: SQL (Structured Query Language) (sql)
让我们更详细地研究一下 MySQL UPDATE JOIN
语法:
- 首先,在
UPDATE
子句之后指定主表 (T1
) 以及您希望主表连接到的表 (T2
)。请注意,您必须在UPDATE
子句后至少指定一个表。UPDATE
子句后未指定的表中的数据将不会被更新。 - 接下来,指定要使用的连接类型,即
INNER JOIN
或LEFT JOIN
以及连接谓词。JOIN
子句必须出现在UPDATE
子句之后。 - 然后,为
T1
和/或T2
表中要更新的列分配新值。 - 之后,在
WHERE
子句中指定一个条件,将行限制为要更新的行。
如果您遵循UPDATE
语句教程,您会注意到还有另一种方法可以使用以下语法来更新数据跨表:
UPDATE T1, T2
SET T1.c2 = T2.c2,
T2.c3 = expr
WHERE T1.c1 = T2.c1 AND condition
Code language: SQL (Structured Query Language) (sql)
此UPDATE
语句的工作方式与带有隐式INNER JOIN
子句的UPDATE JOIN
相同。这意味着你可以将上面的语句改写如下:
UPDATE T1,T2
INNER JOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition
Code language: SQL (Structured Query Language) (sql)
让我们看一些使用UPDATE JOIN
语句的示例,以便更好地理解。
MySQL 更新连接示例
我们将使用一个名为empdb
的新示例数据库进行演示。该示例数据库由两个表组成:
employees
表存储员工数据,包括员工 ID、姓名、绩效和工资。-
merits
表存储员工绩效和绩效百分比。
以下语句在empdb
示例数据库中创建并加载数据:
CREATE DATABASE IF NOT EXISTS empdb;
USE empdb;
-- create tables
CREATE TABLE merits (
performance INT(11) NOT NULL,
percentage FLOAT NOT NULL,
PRIMARY KEY (performance)
);
CREATE TABLE employees (
emp_id INT(11) NOT NULL AUTO_INCREMENT,
emp_name VARCHAR(255) NOT NULL,
performance INT(11) DEFAULT NULL,
salary FLOAT DEFAULT NULL,
PRIMARY KEY (emp_id),
CONSTRAINT fk_performance FOREIGN KEY (performance)
REFERENCES merits (performance)
);
-- insert data for merits table
INSERT INTO merits(performance,percentage)
VALUES(1,0),
(2,0.01),
(3,0.03),
(4,0.05),
(5,0.08);
-- insert data for employees table
INSERT INTO employees(emp_name,performance,salary)
VALUES('Mary Doe', 1, 50000),
('Cindy Smith', 3, 65000),
('Sue Greenspan', 4, 75000),
('Grace Dell', 5, 125000),
('Nancy Johnson', 3, 85000),
('John Doe', 2, 45000),
('Lily Bush', 3, 55000);
Code language: SQL (Structured Query Language) (sql)
带有 INNER JOIN 子句的 MySQL UPDATE JOIN 示例
假设您想根据员工的绩效调整员工的工资。
绩效的百分比存储在merits
表中,因此,您必须使用UPDATE INNER JOIN
语句根据merits
表中存储的percentage
来调整employees
表中员工的工资。
employees
和merit
表之间的联系是performance
字段。请参阅以下查询:
UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * percentage;
Code language: SQL (Structured Query Language) (sql)

查询如何工作。
我们在UPDATE
子句后仅指定employees
表,因为我们只想更新employees
表中的数据。
对于employees
表中的每一行,查询将绩效列中的值与merits
表中绩效列中的值进行检查。如果找到匹配项,它将获取merits
表中的percentage
并更新employees
表中的salary
列。
因为我们在UPDATE
语句中省略了WHERE
子句,所以employees
表中的所有记录都会更新。
使用 LEFT JOIN 的 MySQL UPDATE JOIN 示例
假设公司又雇佣了两名员工:
INSERT INTO employees(emp_name,performance,salary)
VALUES('Jack William',NULL,43000),
('Ricky Bond',NULL,52000);
Code language: SQL (Structured Query Language) (sql)
由于这些员工是新员工,因此他们的绩效数据不可用或为NULL
。

要增加新员工的工资,您不能使用UPDATE INNER JOIN
语句,因为他们的绩效数据在merit
表中不可用。这就是UPDATE LEFT JOIN
能够发挥作用的原因。
当一个表中的行在另一个表中没有对应的行时, UPDATE LEFT JOIN
语句基本上会更新该行。
例如,您可以使用以下语句将新员工的工资增加 1.5%:
UPDATE employees
LEFT JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * 0.015
WHERE
merits.percentage IS NULL;
Code language: SQL (Structured Query Language) (sql)

在本教程中,我们向您展示了如何使用 MySQL UPDATE JOIN
以及INNER JOIN
和LEFT JOIN
子句来执行跨表更新。