有点 SQL 基础的朋友确定听过 「跨表查询」,那啥是跨表更新啊?sql
背景ide
项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为翻译
t_dept_members, 系统中有另一张表 t_user_info 记录了人员信息。要求将 t_dept_members 中有变化的信息更新到 t_user 表中,这个需求就是「跨表更新」啦code
憨B SQL 直接被秒杀orm
不带脑子出门的就写出了下面的 SQLblog
看到身后 DBA 小段总在修仙,想着让他帮润色一下,因而发给了他,而后甩手回来就是这个样子:rem
看到这个 SQL 语句我都惊呆了,还能这样写,在无情的嘲笑下,一声 KO 我直接倒下。死也得死的明白,咱得查查这是咋回事啊it
Mysql Update Joinio
咱们常常使用 join 查询表中具备(在 INNER JOIN 状况下)或可能没有(在 LEFT JOIN 状况下)另外一个表中匹配行的表中的行。table
一样,在 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
咱们仍是详细的说明一下上面的语法:
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
我的建议仍是加上 inner join 关键字吧,这样可读性更好,尽享丝滑,你以为呢?
我摸鱼看到的,以为是灵魂翻译
谈太廉,秀你码 (Talk is cheap,show me the code)
Update Join 例子
年末了,又到了评绩效的时候了,就是那个叫 KPI 的东东(大家有吗),据说要根据 KPI 调工资了。有两张表
第一张表「employees-员工表」
建表语句以下:
create table employees ( employee_id bigint auto_increment comment '员工ID,主键', employee_name varchar(50) null comment '员工名称', performance int(4) null comment '绩效分数 1,2,3,4,5', salary float null comment '员工薪水', constraint employees_pk primary key (employee_id) ) comment '员工表';
第二张表「merits-绩效字典表」
建表语句以下:
create table merits ( performance int(4) null, percentage float null ) comment '绩效字典表';
先生成一些模拟数据
-- 绩效字典初始化数据 INSERT INTO merits(performance, percentage) VALUES (1, 0), (2, 0.01), (3, 0.03), (4, 0.05), (5, 0.08); -- 员工表初始化数据 INSERT INTO employees(employee_name, performance, salary) VALUES ('拱哥', 1, 1000), ('小段总', 3, 20000), ('大人', 4, 18000), ('司令', 5, 28000), ('老六', 2, 10000), ('罗蒙', 3, 20000);
调薪规则:
原有薪资 + (原有薪资 * 当前绩效对应的调薪百分比)
按照调薪规则写 update 语句:
UPDATE employees INNER JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * percentage;
拱哥绩效很差,没给涨工资......
三横一竖一咕嘎,四个小猪