

跨表查询经常有,何为跨表更新?
source link: https://segmentfault.com/a/1190000021675558
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊?
背景
项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为
t_dept_members
, 系统中有另外一张表 t_user_info
记录了人员信息。要求将 t_dept_members
中有变化的信息更新到 t_user
表中,这个需求就是「跨表更新」啦
憨B SQL 直接被秒杀
不带脑子出门的就写出了下面的 SQL
看到身后 DBA 小段总在修仙,想着让他帮润色一下:stuck_out_tongue_winking_eye:,于是发给了他,然后甩手回来就是这个样子:
看到这个 SQL 语句我都惊呆了,还能这样写,在无情的嘲笑下,一声 KO 我直接倒下。死也得死的明白,咱得查查这是咋回事啊
Mysql Update Join
我们经常使用 join
查询表中具有(在 INNER JOIN
情况下)或可能没有(在 LEFT 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
个人建议还是加上 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;
拱哥绩效不好,没给涨工资......
三横一竖一咕嘎,四个小猪:pig:来吃zha,咕嘎咕嘎又来俩
临近年底,公司又来了两位新同事, 但是公司年度绩效已经评完,所以新员工绩效为 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;
到这里,新员工的涨薪工作也做完,拱哥由于知识点了解不透彻,灰溜溜的回家过年
- 如果你也恰巧刚知道这个知识点,请点个「赞」
- 如果你早都知道了这个知识点,还请留言送上「嘘声」
- 如果你年终奖丰厚,希望你2020年更进一步
- 如果你和我一样没有年终奖,别灰心,我们携手进步
流感严重:mask:,春运旅途多加小心
欢迎关注我的公众号 「日拱一兵」,趣味原创解析Java技术栈问题,将复杂问题简单化,将抽象问题图形化落地
如果对我的专题内容感兴趣,或抢先看更多内容,欢迎访问我的博客 dayarch.top
Recommend
-
51
-
56
编者按:成功的人之所以成功,绝不是因为与他人一样。他们明白,要想成功就必须付出更多,更好的强健自己的体魄,更强的武装自己的头脑。本文对二十多位企业高管级人物进行采访,以下是他们分享的帮助他们实现成功的一些日常习惯。...
-
68
这个市场比你想象的更有活力。
-
35
供稿 | eBay ADI-Carmel Team 作者 | 金澜涛 编辑 | 顾欣怡 ...
-
10
品味差却又非常有创意,是一种什么体验?看完这17个作品就懂了 产品设计 / 创意 /
-
7
荣耀60系列新品明日将至 姜海荣:非常有诚意的产品 评论(0)
-
7
V2EX › React React、Vue 关于虚拟 DOM 的文章经常有这样的表述:因为直接操作真实 DOM 耗性能。妥否?
-
2
V2EX › macOS 发现经常有程序导致 M1 MBA 过热 Zien
-
4
余承东点赞小康赛力斯:团队非常有战斗力-品玩 余承东点赞小康赛力斯:团队非常有战斗力 2小时前 日前,乘联会公布2022年6月新能源SUV销量榜,问界M5以7021的月销辆位列第8名,这是问界M5自今年3月份交付以...
-
8
在常规的应用系统开发中,很少会涉及到需要对数据进行分库或者分表的操作,多数情况下,我们习惯使用ORM带来的便利,且使用连接查询是一种高效率的开发方式,就算涉及到分表的场景,很多时候也都可以使用ORM自带的分表规则来解决问题。 比如在电商场景中,用...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK