项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为t_dept_members, 系统中有另一张表 t_user_info 记录了人员信息。html
要求将 t_dept_members 中有变化的信息更新到 t_user 表中,这个需求就是「跨表更新」啦mysql
不带脑子出门的就写出了下面的 SQLsql
看到身后 DBA 在修仙,想着让他帮润色一下,因而发给了他,而后甩手回来就是这个样子:segmentfault
看到这个 SQL 语句我都惊呆了,还能这样写,咱得查查这是咋回事啊spa
咱们常常使用 join 查询表中具备(在 INNER JOIN 状况下)或可能没有(在 LEFT JOIN 状况下)另外一个表中匹配行的表中的行。3d
一样,在 MySQL 中, 咱们也能够在 UPDATE 语句中使用 JOIN 子句执行跨表更新,语法就是这样:code
UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition
咱们仍是详细的说明一下上面的语法:orm
首先,在 UPDATE 子句以后,指定主表(T1)和但愿主表联接到的表(T2)。请注意,必须在UPDATE 子句以后至少指定一个表
接下来,指定你要使用的联接类型,即 INNER JOIN 或 LEFT JOIN 以及联接谓词。 JOIN子句必须出如今 UPDATE 子句以后(这个你们都是知道的哈)htm
而后,将新值分配给要更新的 T1或 T2 表中的列blog
最后,在 WHERE 子句中指定一个条件以将行限制为要更新的行
若是你遵循 update 语法,你会发现有另一种语法也能够完成跨表更新
UPDATE T1, T2 SET T1.c2 = T2.c2, T2.c3 = expr WHERE T1.c1 = T2.c1 AND condition
上面的语法其实隐式使用了 inner join 关键字,彻底等同于下面的样子:
UPDATE T1,T2 INNER JOIN T2 ON T1.C1 = T2.C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition
年末了,又到了评绩效的时候了,据说要根据 KPI 调工资了。有两张表
第一张表「employees-员工表」
第二张表「merits-绩效字典表」
数据以下
调薪规则:原有薪资 + (原有薪资 * 当前绩效对应的调薪百分比)
按照调薪规则写 update 语句:
UPDATE employees INNER JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * percentage;
临近年末,公司又来了两位新同事, 可是公司年度绩效已经评完,因此新员工绩效为 NULL
INSERT INTO employees(employee_name, performance, salary) VALUES ('馮大', NULL, 8000), ('馮二', NULL, 5000);
新员工工做干的不错,也要 1.5% 涨点工资的。若是咱们仍是用 UPDATE INNER JOIN,按照上面的更新语句是不可能完成的,由于条件等式不成立,这是咱们就要用到 UPDATE LEFT JOIN 了
UPDATE employees LEFT JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * 0.015 WHERE merits.percentage IS NULL;
到这里,新员工的涨薪工做也作完