Skip to main content

MySQL更新连接| MySQL中的跨表更新

MySQL更新连接语法

通常使用联接来查询表中的行,这些行在另一个表中具有(内部联接的情况下)或可能不具有(左侧联接的情况下)匹配的行。在MySQL中,可以使用UPDATE语句中的JOIN子句来执行跨表更新。

MySQL更新连接的语法如下:

UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition

让我们更详细地研究一下MySQL更新连接语法:

如果您遵循UPDATE语句教程,您会注意到有另一种方法可以使用以下语法跨表更新数据:

UPDATE T1, T2
SET T1.c2 = T2.c2,
T2.c3 = expr
WHERE T1.c1 = T2.c1 AND condition

此UPDATE语句的工作原理与UPDATE JOIN语句的工作原理相同,UPDATE JOIN语句包含一个隐式内部JOIN子句。这意味着你可以将上述陈述改写如下:

UPDATE T1,T2
INNER JOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition

让我们来看一些使用UPDATE JOIN语句的例子,以便更好地理解。

MySQL更新连接示例

我们将使用一个名为empdb的新示例数据库进行演示。此示例数据库由两个表组成:

以下语句在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);

带有内部连接子句的MySQL更新连接示例

假设你想根据员工的表现调整他们的工资。

优点的百分比存储在优点表中,因此,必须使用UPDATE INTERNAR JOIN语句根据优点表中存储的百分比调整雇员表中雇员的工资。

员工和绩效表之间的链接是绩效字段。请参见以下查询:

UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * percentage;

MySQL Update Join Example

查询是如何工作的。

我们只指定employees table after UPDATE子句,因为我们只想更新employees表中的数据。

对于employees表中的每一行,查询都会将performance列中的值与merits表中performance列中的值进行检查。如果找到匹配项,它将在优点表中获取百分比,并更新employees表中的salary列。

因为我们在UPDATE语句中省略了WHERE子句,所以employees表中的所有记录都会被更新。

使用左连接的MySQL更新连接示例

假设公司再雇佣两名员工:

INSERT INTO employees(emp_name,performance,salary)
VALUES('Jack William',NULL,43000),
('Ricky Bond',NULL,52000);

因为这些员工是新员工,所以他们的绩效数据不可用或为空。

MySQL Update Left Join Example

要增加新员工的薪资,不能使用UPDATE INTERNAR JOIN语句,因为他们的绩效数据在绩效表中不可用。这就是为什么更新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;

MySQL Update Left Join with Example

在本教程中,我们向您展示了如何使用MySQL更新连接和内部连接和左连接子句来执行跨表更新。