2022-10-27 468
有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊?
背景
项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为
t_dept_members, 系统中有另外一张表 t_user_info 记录了人员信息。要求将 t_dept_members 中有变化的信息更新到 t_user 表中,这个需求就是「跨表更新」啦
憨B SQL 直接被秒杀
不带脑子出门的就写出了下面的 SQL
看到身后 DBA 小段总在修仙,想着让他帮润色一下😜,于是发给了他,然后甩手回来就是这个样子:
看到这个 SQL 语句我都惊呆了,还能这样写,在无情的嘲笑下,一声 KO 我直接倒下。死也得死的明白,咱得查查这是咋回事啊
Mysql Update Join
我们经常使用 join 查询表中具有(在 INNER JOIN 情况下)或可能没有(在 LEFT JOIN 情况下)另一个表中匹配行的表中的行。
同样,在 MySQL 中, 我们也可以在 UPDATE 语句中使用 JOIN 子句执行跨表更新,语法就是这样:
UPDATET1,T2, [INNERJOIN|LEFTJOIN]T1ONT1.C1=T2.C1 SETT1.C2=T2.C2, T2.C3=expr WHEREcondition
我们还是详细的说明一下上面的语法:
如果你遵循 update 语法,你会发现有另外一种语法也可以完成跨表更新
UPDATET1,T2 SETT1.c2=T2.c2, T2.c3=expr WHERET1.c1=T2.c1ANDcondition
上面的语法其实隐式使用了 inner join 关键字,完全等同于下面的样子:
UPDATET1,T2 INNERJOINT2ONT1.C1=T2.C1 SETT1.C2=T2.C2, T2.C3=expr WHEREcondition
个人建议还是加上 inner join 关键字吧,这样可读性更好,尽享丝滑,你觉得呢?
我摸鱼看到的,觉得是灵魂翻译
谈太廉,秀你码 (Talk is cheap,show me the code)
Update Join 例子
年底了,又到了评绩效的时候了,就是那个叫 KPI 的东东(你们有吗),听说要根据 KPI 调工资了。有两张表
第一张表「employees-员工表」
建表语句如下:
createtableemployees ( employee_idbigintauto_incrementcomment'员工ID,主键', employee_namevarchar(50)nullcomment'员工名称', performanceint(4)nullcomment'绩效分数1,2,3,4,5', salaryfloatnullcomment'员工薪水', constraintemployees_pk primarykey(employee_id) ) comment'员工表';
第二张表「merits-绩效字典表」
建表语句如下:
createtablemerits ( performanceint(4)null, percentagefloatnull ) comment'绩效字典表';
先生成一些模拟数据
--绩效字典初始化数据 INSERTINTOmerits(performance,percentage) VALUES(1,0), (2,0.01), (3,0.03), (4,0.05), (5,0.08); --员工表初始化数据 INSERTINTOemployees(employee_name,performance,salary) VALUES('拱哥',1,1000), ('小段总',3,20000), ('大人',4,18000), ('司令',5,28000), ('老六',2,10000), ('罗蒙',3,20000);
调薪规则:
原有薪资 + (原有薪资 * 当前绩效对应的调薪百分比)
按照调薪规则写 update 语句:
UPDATEemployees INNERJOIN meritsONemployees.performance=merits.performance SETsalarysalary=salary+salary*percentage;
拱哥绩效不好,没给涨工资……
三横一竖一咕嘎,四个小猪🐷来吃zha,咕嘎咕嘎又来俩
临近年底,公司又来了两位新同事, 但是公司年度绩效已经评完,所以新员工绩效为 NULL
INSERTINTOemployees(employee_name,performance,salary) VALUES('馮大',NULL,8000), ('馮二',NULL,5000);
新员工工作干的不错,也要 1.5% 涨点工资的。如果我们还是用 UPDATE INNER JOIN,按照上面的更新语句是不可能完成的,因为条件等式不成立,这是我们就要用到 UPDATE LEFT JOIN 了
UPDATEemployees LEFTJOIN meritsONemployees.performance=merits.performance SETsalarysalary=salary+salary*0.015 WHEREmerits.percentageISNULL;
到这里,新员工的涨薪工作也做完,拱哥由于知识点了解不透彻,灰溜溜的回家过年
流感严重😷,春运旅途多加小心
欢迎关注我的公众号 「日拱一兵」,趣味原创解析Java技术栈问题,将复杂问题简单化,将抽象问题图形化落地
如果对我的专题内容感兴趣,或抢先看更多内容,欢迎访问我的博客 dayarch.top
原文链接:https://77isp.com/post/10659.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态