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子句来执行跨表更新。