有点 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 子句执行跨表更新,语法就是这样:

UPDATE T1, T2,[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1SET T1.C2 = T2.C2,    T2.C3 = exprWHERE condition

我们还是详细的说明一下上面的语法:

  • 首先,在 UPDATE 子句之后,指定主表(T1)和希望主表联接到的表(T2)。请注意,必须在UPDATE 子句之后至少指定一个表
  • 接下来,指定你要使用的联接类型,即 INNER JOIN 或 LEFT JOIN 以及联接谓词。JOIN子句必须出现在 UPDATE 子句之后(这个大家都是知道的哈)
  • 然后,将新值分配给要更新的 T1或 T2 表中的列
  • 最后,在 WHERE 子句中指定一个条件以将行限制为要更新的行

如果你遵循 update 语法,你会发现有另外一种语法也可以完成跨表更新

UPDATE T1, T2SET T1.c2 = T2.c2,      T2.c3 = exprWHERE T1.c1 = T2.c1 AND condition

上面的语法其实隐式使用了 inner join 关键字,完全等同于下面的样子:

UPDATE T1,T2INNER JOIN T2 ON T1.C1 = T2.C1SET T1.C2 = T2.C2,      T2.C3 = exprWHERE 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 employeesINNER JOIN    merits ON employees.performance = merits.performanceSET salary = salary + salary * percentage;

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

三横一竖一咕嘎,四个小猪?来吃zha,咕嘎咕嘎又来俩

临近年底,公司又来了两位新同事, 但是公司年度绩效已经评完,所以新员工绩效为 NULL

INSERT INTO employees(employee_name, performance, salary)VALUES ('馮大', NULL, 8000),       ('馮二', NULL, 5000);

新员工工作干的不错,也要 1.5%  涨点工资的。如果我们还是用 UPDATE INNER JOIN,按照上面的更新语句是不可能完成的,因为条件等式不成立,这是我们就要用到 UPDATE LEFT JOIN

UPDATE employeesLEFT JOIN    merits ON employees.performance = merits.performanceSET salary = salary + salary * 0.015WHERE merits.percentage IS NULL;

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


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

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

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

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

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


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

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

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

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



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

❤️「转发」和「在看」,是对我最大的支持❤️

点击,获得更多精彩内容

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

  1. 企业实战_14_MyCat跨分片查询_全局表

    接上一篇:企业实战_13_MyCat清除冗余数据 https://gblfy.blog.csdn.net/article/details/100057317 文章目录 一.跨分片查询验证 1. 登录m ...

  2. sql跨表查询_跨表查询经常有,何为跨表更新?

    有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊? 背景 项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为 t_dept_members, ...

  3. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models.T ...

  4. datagridview如何将sqlite实现多表查询_服气!月薪3W的Exceler,居然是这样合并多表数据的...

    私信回复关键词[up],获取VLOOKUP函数用法教程合集! Excel 中最伟大的发明是「数据透视表」. 如果给这个最上再加一个最,那最最伟大的肯定是 Power Query. 可惜,很多同学还在用 ...

  5. oracle 查询天,Oracle查询_ 单表查询

    前面我们详解了关于Oracle的增删改,今天让我们接着来学习Oracle的查询吧, Oracle中查询可是重头戏噢!!!跟着煌sir的步伐,走位,走位~~~ 小知识锦囊 在此前,先讲解一个小知识点 O ...

  6. 【Java从0到架构师】MyBatis - 多表查询_延迟加载

    多表查询_延迟加载 多表关系 一对一 association 标签 + JOIN 实现一对一 一对多 \ 多对一 collection 标签 + LEFT JOIN 实现一对多 多对多 多对多的本质: ...

  7. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  8. mysql联表查询count错误_关于count(*)和联表查询和锁表的问题

    刚开始学MySQL,在描述时候假如有不对的地方,希望各位大大指出. 本人在看书的时候看到了这么一句,在生产环境中请不要随意使用count(*),原因是它将会进行表级锁定(inno DB下). 原因是最 ...

  9. MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)

    MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...

最新文章

  1. 一个小需求,能够做到月活跃用户5000万,就是真牛逼!
  2. 好程序员Web前端教程分享Vue学习心得
  3. 代码高亮_微信公众号代码高亮美化工具 Markdown Nice
  4. 计算机用户名密码策略,设置域用户帐户密码策略
  5. SAP UI5应用入口App.controller.js是如何被UI5框架加载的?
  6. react判断点击位置是否为组件内,实现点击外部触发组件内事件
  7. 混合类型数据格式化输入
  8. Linux 文件描述符的概念及与文件流指针的关系
  9. com.alibaba.fastjson.JSONObject之对象与JSON
  10. Codeforces Edu Round 64 (Rated for Div. 2)
  11. 无聊的python课程_5 个无聊 Python 程序,用 Python 整蛊你的朋友们吧
  12. 2008生产实习 日程安排
  13. 图书馆占座系统(六)
  14. 解决:Please either set ERLANG_HOME to point to your Erlang installation or place the RabbitMQ server d
  15. VC “变速齿轮”再研究
  16. windows10下F1-F11快捷键及window+Dor+E快捷键打开关闭控制
  17. 算法:数组中寻找两个数字的和等于固定值
  18. 软件测试面试宝典(2022面试预测)——软件测试大厂试题
  19. 【题解】2020年蓝桥杯C/C++程序设计B组·试题 D: REPEAT 程序
  20. (附源码)springboot实验室预约管理系统 毕业设计 261141

热门文章

  1. 【Azure Show】|第九期 “我的计算机入门之路” 嘉宾秦婷婷汪宇杰文轩
  2. 开源特训营 - Lesson 4 - 如何运营社区
  3. 初识ABP vNext(8):ABP特征管理
  4. .NET开发者省份分布排名
  5. Excel催化剂回顾2019年产出(文章合集),展望2020年
  6. 程序员修神之路--打通Docker镜像发布容器运行流程
  7. 程序员家的精品大闸蟹:青壳、白底、肉多、爆黄,现在是吃大闸蟹的最佳时期...
  8. WeihanLi.Npoi 导出支持自定义列内容啦
  9. 使用Azure云原生构建博客是怎样一种体验?(下篇)
  10. Asp.net core使用MediatR进程内发布/订阅