当前位置: 首页 > 科技观察

经常会有跨表查询,什么是跨表更新?_0

时间:2023-03-19 19:07:26 科技观察

有点SQL基础的朋友一定听说过“跨表查询”,那么什么是跨表更新呢?后台工程新导入了一批人事资料。这些人员的部分部门名称发生了变化,部分联系方式发生了变化。我们暂且称这个表为t_dept_members。系统中还有一个表t_user_info,用于记录人员信息。需要将t_dept_members中的变化信息更新到t_user表中。这个需求就是“跨表更新”。BSQL想都没想就直接秒杀了。我写了下面的SQL,看到后面的DBA一直在修仙。我想请他帮我打磨一下#128540;于是发给他,然后回了这样:看到这条SQL语句我惊呆了,居然还能这么写。我直接摔倒了。我要死才能理解,我们得看看是怎么回事MysqlUpdateJoin我们经常使用join来查询一个表是否有(在INNERJOIN的情况下)或可能没有(在LEFTJOIN的情况下)匹配另一个表Rows表中的行。同样,在MySQL中,我们也可以在UPDATE语句中使用JOIN子句来进行跨表更新。语法是这样的:UPDATET1,T2,[INNERJOIN|LEFTJOIN]T1ONT1.C1=T2.C1SETT1.C2=T2.C2,T2.C3=exprWHEREcondition我们来详细解释一下上面的语法:首先,在UPDATE子句之后,指定主表(T1)和您希望主表加入的表(T2)。请注意,在UPDATE子句之后至少必须指定一个表接下来,指定要使用的连接类型,INNERJOIN或LEFTJOIN,以及连接谓词。JOIN子句必须出现在UPDATE子句之后(这个大家都知道)然后,将新值赋给T1或T2表中要更新的列最后,在WHERE子句中指定一个条件来限制行为要更新的行updated,如果你按照update语法,你会发现还有一种语法也可以跨表更新隐式使用了innerjoin关键字,完全等价于:UPDATET1,T2INNERJOINT2ONT1.C1=T2.C1SETT1.C2=T2.C2,T2.C3=exprWHEREcondition个人建议是加上innerjoin关键字,这样可读性更好,享受丝般顺滑,你觉得呢?钓鱼看到的,还以为是魂译呢。Talkischeap,showmethecode(Talkischeap,showmethecode)UpdateJoin例子年底了,又到了评估性能的时候了。就是那个叫KPI的东西(有没有),听说工资会根据KPI来调整。有两张桌子。第一张表“employees-员工表”建表语句如下:createtableemployees(employee_idbigintauto_incrementcomment'员工ID,主键',employee_namevarchar(50)nullcomment'员工姓名',performanceint(4)nullcomment'绩效分1,2,3,4,5',salaryfloatnullcomment'员工工资',constrainttemployees_pkprimarykey(employee_id))comment'员工表';第二张表“绩效字典表”建表语句如下: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),('adult',4,18000),('指挥官',5,28000),('第六',2,10000),('罗蒙',3,20000);调薪规则:原薪+(原薪*当前绩效对应调薪百分比)根据调薪规则写更新语句:UPDATEemployeesINNERJOINmeritsONemployees.performance=merits.performanceSETsalarysalary=salary+salary*percentage;宫哥业绩不好,也没给加薪……三横一纵一咕嘎,四只小猪…来吃咋了,咕咕咕嘎又来了两个。临近年末,公司有两个新同事,但是公司的年度业绩已经进行了考核,所以新员工的业绩为NULLINSERTITOemployees(employee_name,performance,salary)VALUES('丰大',NULL,8000),('丰二',NULL,5000);新员工干得不错,需要加薪1.5%。如果我们仍然使用UPDATEINNERJOIN,按照上面的update语句是不可能的,因为条件相等不成立,这就是我们需要使用UPDATELEFTJOINUPDATEemployeesLEFTJOINmeritsONemployees.performance=merits.performanceSETsalarysalary=salary+salary*0.015WHEREmerits。百分比ISNULL;到这里,新员工的加薪也做完了,龚哥因为没有把知识点理解透彻,灰溜溜的回家过年了。如果你刚好知道这个知识点,请点“赞”声”如果你有不错的年终奖,希望你在2020年走得更远。如果你和我一样没有年终奖,不要气馁,我们会携手并进。流感严重😷,春节出行注意安全。一兵一卒》,有趣的Java技术栈问题原创分析,复杂问题的简单化,以及抽象问题的图形化实现。如果您对我的主题内容感兴趣,或者先阅读更多内容,欢迎访问我的博客dayarch.top

最新推荐
猜你喜欢