MySQL UPDATE JOIN
简介:在本教程中,您将学习如何使用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
让我们更详细地研究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
此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
让我们看一些使用UPDATE JOIN语句以更好地理解的示例。
MySQL UPDATE JOIN示例
我们将使用一个新的示例数据库empdb进行演示。
该示例数据库由两个表组成:
员工表存储具有员工ID,姓名,绩效和薪水的员工数据。
优点表存储员工的绩效和绩效百分比。
以下语句在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);
带有INNER JOIN子句的MySQL UPDATE JOIN示例
假设您要根据员工的绩效来调整他们的工资。
优点的百分比存储在优点表中,因此,您必须使用UPDATE INNER JOIN语句根据优点表中存储的百分比调整雇员表中的雇员薪水。
员工和绩效表之间的链接是``绩效''字段。
请参阅以下查询:
UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * percentage;
查询的工作方式。
我们只在UPDATE子句后指定employees表,因为我们只想更新employee表中的数据。
对于employees表中的每一行,该查询都会将性能列中的值与优点表中性能列中的值进行比较。
如果找到匹配项,它将获取价值表中的百分比并更新员工表中的薪水列。
因为我们在UPDATE语句中省略了WHERE子句,所以employee表中的所有记录都被更新了。
带有LEFT JOIN的MySQL UPDATE JOIN示例
假设公司再雇用两名员工:
INSERT INTO employees(emp_name,performance,salary)
VALUES('Hyman William',NULL,43000),
('Ricky Bond',NULL,52000);
因为这些员工是新员工,所以他们的绩效数据不可用或为NULL。
要增加新员工的薪水,您不能使用UPDATE INNER JOIN语句,因为其绩效数据在绩效表中不可用。
这就是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;
在本教程中,我们向您展示了如何结合使用MySQL UPDATE JOIN和INNER JOIN和LEFT JOIN子句来执行跨表更新。

