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