sql跨表查询_跨表更新,看到自己写的SQL像个憨憨

bac7f51a9ea783d4dc055b3e2ec47250.gif

有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊?

背景

项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为

t_dept_members, 系统中有另外一张表 t_user_info 记录了人员信息。要求将 t_dept_members 中有变化的信息更新到 t_user 表中,这个需求就是「跨表更新」啦

憨B SQL 直接被秒杀

不带脑子出门的就写出了下面的 SQL

496d2bef87a4a05444ca808981df912a.png

看到身后 DBA 小段总在修仙,想着让他帮润色一下?,于是发给了他,然后甩手回来就是这个样子:

29721f16d54b709808329ced79d50e9b.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-员工表」

1a820b77f45b482e4836d392cc1be5f9.png

建表语句如下:

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-绩效字典表」

c5814f33049e4ffb26253210e4d1d880.png

建表语句如下:

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);
141063acae471156a3bc767fd005297b.png

调薪规则:

原有薪资 + (原有薪资 * 当前绩效对应的调薪百分比)

按照调薪规则写 update 语句:

UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET salary = salary + salary * percentage;
c807cce845c39e00496cfebd898d0fb1.png

拱哥绩效不好,没给涨工资......

三横一竖一咕嘎,四个小猪?来吃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;
71d78e3a85d34d987bf27e651f14f8ed.png

到这里,新员工的涨薪工作也做完,拱哥由于知识点了解不透彻,灰溜溜的回家过年


  • 如果你也恰巧刚知道这个知识点,请点个「在看Wow」

  • 如果你早都知道了这个知识点,还请留言送上「嘘声」

  • 如果你年终奖丰厚,希望你2020年更进一步

  • 如果你和我一样没有年终奖,别灰心,我们携手进步

这是年前最后一篇文章,这个时间还能看这篇文章的一定是真爱了?❤️

2cdf219522412c8322ee9f1f144eee3d.png

新朋友,公众号回复「进群」或点击菜单「加我好友」加我微信,备注「除夕夜」

老朋友,已经加过微信的也请留言「过大年」

感谢公众号伙伴一年的陪伴和支持,除夕夜会送上小小的惊喜娱乐一下??,回馈大家,(我会陆续将各位拉到群内,截止到1月23日晚 20:00)

最后,流感严重?,春运旅途多加小心,我们年后继续相约在这里


3dd92b8e1385cf6cc72553068a944cf4.png

加入我的微信圈子,纯净欢快的学习环境在这里

❤️「转发」和「在看」,是对我最大的支持❤️
cada30b9c53b4877945e218c91415b7a.gif点击,获得更多精彩内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iText创建一个含有中文的pdf文档

有朋友问我pdfbox支不支持向pdf文档中写入中文。然后试了好多遍都是有乱码,也找了好多资料没有找到解决办法。 但是在查找资料的过程中发现了另一个处理pdf的开源库iText.官方介绍 http://itextpdf.com/ 在这参考了两篇博客 博客1.pdfbox&iText生成PDF文件格式及…

万字长文 - 解读功能开关 | IDCF

原文:https://martinfowler.com/articles/feature-toggles.html作者:Pete Hodgson译者:冬哥功能开关Feature Toggle(通常也称为功能标志Feature Flag)是一种强大的技术,允许团队在不更改代码的情况下修改系…

2000多一件的大牌T恤,真实成本有多少?

▲ 点击查看喜大普奔,2021年度T恤大战总算是要在全国范围揭幕了。夏天的T恤永远不嫌多,基础款、印花款,从入春以来我们商城也陆陆续续上架了不少。但始终还有一些空白尚未填补,例如我们一直想给大家再找一些看起来上档次、穿起来显…

linux之使用indent格式化代码总结

1、介绍indent indent是一个整理代码的工具,不管你的代码写得多乱,你用indent工具都会把你的代码风格和linux 内核代码一致,基本上每个linux 发布都可以找到或者自己安装 sudo apt-get install indent 2、indent具体详细地址 比如在我的电脑上地址图片如下 所以地址在 /us…

使用 Dapr 缩短软件开发周期

Microsoft DevOps 文档里的文章(https://docs.microsoft.com/zh-cn/azure/devops/report/dashboards/cycle-time-and-lead-time?viewazure-devops)中的这张图片在给我们介绍了 什么是周期时间 以及它如何影响我的项目流时非常有影响力。第一次输入 &quo…

linux之写C代码出现warning: format not a string literal and no format arguments [-Wformat-security]

今天编写c语言代码的时候出现下面错误 解决办法: 把printf("length is %d" length);改成 printf("length is %d", length); 以后特么不要 像傻逼换这种错误,日来狗,写java代码写习惯了,不能动不动就是。

ppt变成了图片不能编辑文字怎么办_谁说水印一定要去掉?用到PPT里贼好看好吗!...

嗨,各位木友们好呀,我是小木。作为一个男生…我有一万个理由相信,很多人入坑PS,就是从“想要去除图片上的水印”开始的…不过,今天我不是来教大家怎么开车的…相反,我是要来教大家怎么在PPT里添加“水印”的…

补充一点地理知识(以洲来划分各个国家(240个))

一个博客上看到的,不错: http://statisticstimes.com/geography/countries-by-continents.php List of Countries by Continent This list is devised by the United Nations Statistics Division (UNSD) for statistical purpose. This is a list of 24…

开源与自由 | 商业自由:从边缘到核心贡献

文 | 肖滢策划 | h4cd出品 | OSC开源社区(ID:oschina2013)当我们谈论开源时,很少谈论自由,尽管开源与自由同行。从 1998 年开源兴起时,我们就无法把开源和自由分割开来。因为它孕育于自由软件运动&#xff…

表面上在帮女朋友拍照,其实镜头瞄准的是......

1 哈哈哈哈哈(素材来源网络,侵删)▼2 永远喝不完的牛奶(素材来源网络,侵删)▼3 我的电动车不见了(素材来源网络,侵删)▼4 这次的事就拜托了(素材来源网络&…

pandas添加一行数据_恨晚,Python探索性数据分析神器pandas-profiling,一行代码搞定...

我们使用Pandas进行数据分析时,首先要先对数据集进行探索性数据分析(Exploratory data analysis),以便有一个大体的了解,明确后续数据处理、分析方向,数据EDA大致包含如下内容:感知数据的直观表现 挖掘潜在的结构 提取…

Natasha 4.0 探索之路系列(一) 概况

简介Natasha 是一个基于 Roslyn 的动态编译类库,它以极简的 API 完成了动态编译的大部分功能,使用它可以在程序运行时编译出新的程序集。Natasha 允许开发人员直接使用 C# 代码即可编写运行时的功能,避免了 Emit 的学习、开发、维护的成本。N…

相信应该有百分九十的男生看见这个东西是这个状态吧?

1 8400亿人民币是什么概念?(素材来源网络,侵删)▼2 神奇的翻译(素材来源豆瓣,侵删)▼3 医生为什么喜欢把手背在后面呢?(素材来源网络,侵删)▼4 …

postman安装_Postman插件的应用与实战(二)

在postman插件的应用与实战(一)中,介绍了postman插件的安装,使用,collestion的创建以及应用,本小节中,我们来介绍postman结合newman和jenkins持续构建工具,来对postman中的接口测试进行统一的管理。关于new…

struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式

本文演示了JSP中获取HTTP参数的几种方式&#xff0c;还有action中获取HTTP参数的几种方式。 1. 创建JSP页面&#xff08;testParam.jsp&#xff09; <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% page isELIg…

HTTP—缓存

1. ETag HTTP 1.1中引入了ETag来解决缓存的问题。ETag全称是Entity Tag&#xff0c;由服务端生成&#xff0c;服务端可以决定它的生成规则。如果根据文件内容生成散列值。那么条件请求将不会受到时间戳的改动造成带宽浪费。下面是根据内容生成散列值的方法&#xff1a; 1 var g…

盖茨被逐出微软董事会真相曝光:长期跟员工搞地下情,27年婚姻中出轨不断,人设已崩...

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;量子位作者&#xff1a;梦晨 鱼羊2020年3月&#xff0c;在比尔盖茨辞去微软董事会职务的时候&#xff0c;人们都在感慨一代互联网大拿&#xff0c;纷纷都到了交接班的时候。万万没想到&#xff0c;一年多之后&#xff0c…

Natasha 4.0 探索之路系列(二) 「域」与插件

域与ALC在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题&#xff0c;能不能兼容 AppDomain、如何使用 AppDomain、为什么 CoreAPI 阉割了 AppDomain 等一系列的问题。今天答复一下&#xff1a;首先 AppDomain 作为程序集隔离容器的存在&#xff0c;是风靡了 .NET Framewo…

cake fork什么意思_Java7任务并行执行神器:Forkamp;Join框架

Fork/Join是什么&#xff1f;Fork/Join框架是Java7提供的并行执行任务框架&#xff0c;思想是将大任务分解成小任务&#xff0c;然后小任务又可以继续分解&#xff0c;然后每个小任务分别计算出结果再合并起来&#xff0c;最后将汇总的结果作为大任务结果。其思想和MapReduce的…