MySQL UPDATE JOIN
MySQL中的UPDATE查询是用于修改表数据的DML语句。UPDATE查询必须需要SET和WHERE子句。SET子句用于更改在WHERE子句中指定的列的值。
MySQL中的JOIN子句用于在单个查询中连接多个表以检索数据。
UPDATE JOIN是一个MySQL语句,用于执行跨表更新操作,这意味着我们可以使用JOIN子句条件更新一个表中的数据,并使用另一个表。此查询根据 主键 和 外键 以及指定的连接条件来更新和修改数据。我们可以使用 UPDATE查询 同时更新一个或多个列。
注意:MySQL UPDATE JOIN语句支持4.0版本或更高版本。
语法
以下是修改MySQL表记录的UPDATE JOIN语句的基本语法:
UPDATE Tab1, Tab2, [INNER JOIN | LEFT JOIN] Tab1 ON Tab1.C1 = Tab2.C1
SET Tab1.C2 = Tab2.C2, Tab2.C3 = expression
WHERE Condition;
在上述MySQL UPDATE JOIN语法中:
首先,我们在UPDATE子句之后指定了两个表:主表(Tab1)和另一个表(tab2)。在UPDATE子句之后,必须至少指定一个表。接下来,我们指定了JOIN子句的类型,即INNER JOIN或LEFT JOIN,它们紧随在UPDATE子句之后,然后是ON关键字后指定的连接谓词。然后,我们需要为Tab1和/或Tab2中的列赋予新值,以修改表。最后,WHERE子句条件用于限制更新的行数。
MySQL中的UPDATE JOIN是如何工作的?
在MySQL中,UPDATE JOIN的工作过程与上述语法中描述的相同。但有时候,我们会发现这个查询单独执行交叉表更新,而不涉及任何连接。 以下语法是使用另一个表更新一个表的另一种方式:
UPDATE Tab1, Tab2,
SET Tab1.C2 = Tab2.C2, Tab2.C3 = expression
WHERE Tab1.C1 = Tab2.C1 AND condition;
以上的UPDATE语句产生与使用INNER JOIN或LEFT JOIN子句的UPDATE JOIN相同的结果。这意味着我们可以将上述语法重新编写为上面显示的UPDATE JOIN语法:
UPDATE Tab1,Tab2
INNER JOIN Tab2 ON Tab1.C1 = Tab2.C1
SET Tab1.C2 = Taba2.C2, Tab2.C3 = expression
WHERE condition
让我们通过一些例子来理解在MySQL表中如何使用UPDATE JOIN语句。
UPDATE JOIN示例
首先,我们将创建两个表,分别命名为 Performance 和 Employee ,并且这两个表通过外键相关联。在这里,“Performance”是一个 父表 ,而“Employees”是 子表 表 。下面的脚本创建了这两个表及其记录。
表:Performance
CREATE TABLE Performance (
performance INT(11) NOT NULL,
percentage FLOAT NOT NULL,
PRIMARY KEY (performance)
);
接下来,使用INSERT语句填充表中的记录。
INSERT INTO Performance (performance, percentage)
VALUES(101,0),
(102,0.01),
(103,0.03),
(104,0.05),
(105,0.08);
然后,执行SELECT查询以验证数据,如下图所示:
表格:员工信息
CREATE TABLE Employees (
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
performance INT(11) DEFAULT NULL,
salary FLOAT DEFAULT NULL,
CONSTRAINT fk_performance FOREIGN KEY (performance) REFERENCES Performance (performance)
);
接下来,使用INSERT语句填充表中的记录。
INSERT INTO Employees (name, performance, salary)
VALUES('Mary', 101, 55000),
('John', 103, 65000),
('Suzi', 104, 85000),
('Gracia', 105, 110000),
('Nancy Johnson', 103, 95000),
('Joseph', 102, 45000),
('Donald', 103, 50000);
然后,按照下图所示执行SELECT查询来验证数据:
更新与内连接示例的JOIN
假设我们想要根据员工的表现来更新其薪水。我们可以使用UPDATE INNER JOIN语句在Employees表中更新员工的薪水,因为表现百分比存储在performance表中。
在上述表中,我们必须使用performance字段来连接Employees和Performance表。请看下面的查询:
UPDATE Employees e
INNER JOIN Performance p
ON e.performance = p.performance
SET salary = salary + salary * percentage;
执行上述语句后,我们将获得下面的输出,在这里我们可以看到员工的薪水列已成功更新。
让我们了解一下这个在MySQL中的查询是如何工作的。在查询中,我们只在UPDATE子句后指定了Employees表。这是因为我们只想在Employees表中更改记录,而不是在两个表中都更改。
查询将在“Employees”表中的每一行对performance列的值与“Performance”表中的performance列进行匹配。如果它匹配performance列,它将获取Performance表中的百分比并更新Employees表的salary列。这个查询会更新Employees表中的所有记录,因为我们在UPDATE JOIN查询中没有指定WHERE子句。
UPDATE JOIN with LEFT JOIN示例
为了理解使用LEFT JOIN的UPDATE JOIN,我们首先需要向Employees表中插入两行新记录:
INSERT INTO Employees (name, performance, salary)
VALUES('William', NULL, 73000),
('Rayan', NULL, 92000);
由于这些员工是新招聘的,所以他们的业绩记录尚不可用。请参见下面的输出:
如果我们想要更新新雇员的薪水 ,我们不能使用UPDATE INNER JOIN查询。这是因为在Performance表中没有他们的绩效数据。因此,我们将使用UPDATE LEFT JOIN语句来实现这个需求。
在MySQL中,UPDATE LEFT JOIN语句用于在另一个表的相应行中找不到记录时更新表中的一行。
例如 ,如果我们想要将新雇员的薪水增加2.5%,我们可以使用以下语句来实现:
UPDATE Employees e
LEFT JOIN Performance p
ON e.performance = p.performance
SET salary = salary + salary * 0.025
WHERE p.percentage IS NULL;
执行上述查询后,我们将获得如下图像的输出,我们可以看到新录用员工的薪水已成功更新。
在本文章中,我们学习了MySQL Update Join语句,它允许我们使用JOIN子句条件将另一个表中的新数据修改到一张表中的现有数据。当我们需要修改在WHERE子句中指定的特定列,并且同时使用INNER JOIN或LEFT JOIN子句时,这个查询是有优势的。