MySQL UPDATE JOIN
简介:在本教程中,您将学习如何使用MySQL UPDATE JOIN语句来执行跨表更新。我们将逐步向您展示如何 在声明中使用
INNER JOIN
子句和LEFT JOIN
子句UPDATE
。
MySQL UPDATE JOIN语法
您经常使用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
语法:
- 首先,在子句后面指定主表(
T1
)和主表要加入的表(T2
)UPDATE
。请注意,您必须在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
语句UPDATE JOIN
与隐式INNER 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
的新示例数据库进行演示。此示例数据库包含两个表:
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);
MySQL UPDATE JOIN 使用INNER JOIN子句实例
假设您想根据员工的绩效调整员工的薪水。 优点的百分比存储在merits
表中,因此,您必须使用 UPDATE INNER JOIN
语句根据employees
表中percentage
存储的内容调整merits
表中员工的工资。
employees
和merit
表之间的链接是 performance
字段。请参阅以下查询:
UPDATE employees INNER JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * percentage;运行结果:
mysql> select * from employees; +--------+---------------+-------------+--------+ | emp_id | emp_name | performance | salary | +--------+---------------+-------------+--------+ | 1 | Mary Doe | 1 | 50000 | | 2 | Cindy Smith | 3 | 66950 | | 3 | Sue Greenspan | 4 | 78750 | | 4 | Grace Dell | 5 | 135000 | | 5 | Nancy Johnson | 3 | 87550 | | 6 | John Doe | 2 | 45450 | | 7 | Lily Bush | 3 | 56650 | +--------+---------------+-------------+--------+ 7 rows in set (0.00 sec)查询的工作原理。 我们只指定
employees
表在 UPDATE
子句之后,因为我们只想更新employees
表中的数据 。
对于employees
表中的每一行,查询将根据表中性能列中的值检查性能列中的值merits
。如果找到匹配,它得到了percentage
在merits
表中,并更新salary
列employees
表。
因为我们省略了UPDATE
语句中的WHERE
子句,所以employees
表中的所有记录都会更新。
MySQL UPDATE JOIN 使用LEFT JOIN示例
假设公司雇用了两名员工:INSERT INTO employees(emp_name,performance,salary) VALUES('Jack William',NULL,43000), ('Ricky Bond',NULL,52000);因为这些员工是新员工,所以他们的绩效数据不可用或者
NULL
。
运行结果:
mysql> select * from employees; +--------+---------------+-------------+--------+ | emp_id | emp_name | performance | salary | +--------+---------------+-------------+--------+ | 1 | Mary Doe | 1 | 50000 | | 2 | Cindy Smith | 3 | 66950 | | 3 | Sue Greenspan | 4 | 78750 | | 4 | Grace Dell | 5 | 135000 | | 5 | Nancy Johnson | 3 | 87550 | | 6 | John Doe | 2 | 45450 | | 7 | Lily Bush | 3 | 56650 | | 8 | Jack William | NULL | 43000 | | 9 | Ricky Bond | NULL | 52000 | +--------+---------------+-------------+--------+ 9 rows in set (0.00 sec)要增加新员工的工资,您不能使用
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;运行结果:
mysql> select * from employees; +--------+---------------+-------------+--------+ | emp_id | emp_name | performance | salary | +--------+---------------+-------------+--------+ | 1 | Mary Doe | 1 | 50000 | | 2 | Cindy Smith | 3 | 66950 | | 3 | Sue Greenspan | 4 | 78750 | | 4 | Grace Dell | 5 | 135000 | | 5 | Nancy Johnson | 3 | 87550 | | 6 | John Doe | 2 | 45450 | | 7 | Lily Bush | 3 | 56650 | | 8 | Jack William | NULL | 43645 | | 9 | Ricky Bond | NULL | 52780 | +--------+---------------+-------------+--------+ 9 rows in set (0.00 sec)在本教程中,我们向您展示了如何使用
UPDATE JOIN
带有INNER JOIN
和LEFT JOIN
子句的MySQL 来执行跨表更新。