有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊?
背景
项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为
t_dept_members
, 系统中有另外一张表 t_user_info
记录了人员信息。要求将 t_dept_members
中有变化的信息更新到 t_user
表中,这个需求就是「跨表更新」啦
憨B SQL 直接被秒杀
不带脑子出门的就写出了下面的 SQL
看到身后 DBA 小段总在修仙,想着让他帮润色一下"" referrerpolicy="no-referrer" alt="" src="/UploadFiles/2021-04-09/2020020409334612.png">
看到这个 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;
拱哥绩效不好,没给涨工资......
三横一竖一咕嘎,四个小猪"htmlcode">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;到这里,新员工的涨薪工作也做完,拱哥由于知识点了解不透彻,灰溜溜的回家过年
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]