在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊? 背景 项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为
憨B SQL 直接被秒杀 不带脑子出门的就写出了下面的 SQL 看到身后 DBA 小段总在修仙,想着让他帮润色一下😜,于是发给了他,然后甩手回来就是这个样子: 看到这个 SQL 语句我都惊呆了,还能这样写,在无情的嘲笑下,一声 KO 我直接倒下。死也得死的明白,咱得查查这是咋回事啊 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 我们还是详细的说明一下上面的语法: 首先,在 UPDATE 子句之后,指定主表(T1)和希望主表联接到的表(T2)。请注意,必须在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 上面的语法其实隐式使用了 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 例子 年底了,又到了评绩效的时候了,就是那个叫 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; 拱哥绩效不好,没给涨工资...... 三横一竖一咕嘎,四个小猪🐷来吃zha,咕嘎咕嘎又来俩 临近年底,公司又来了两位新同事, 但是公司年度绩效已经评完,所以新员工绩效为 NULL INSERT INTO employees(employee_name, performance, salary) VALUES ('馮大', NULL, 8000), ('馮二', NULL, 5000); 新员工工作干的不错,也要 UPDATE employees LEFT JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * 0.015 WHERE merits.percentage IS NULL; 到这里,新员工的涨薪工作也做完,拱哥由于知识点了解不透彻,灰溜溜的回家过年 |
请发表评论