跨表查询经常有,何为跨表更新?

简介: 跨表查询经常有,何为跨表更新?

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


背景


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


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


憨B SQL 直接被秒杀



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


微信图片_20220510161551.png


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


微信图片_20220510161646.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-员工表」


微信图片_20220510161824.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-绩效字典表」


微信图片_20220510161858.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);


微信图片_20220510161946.png


调薪规则:

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


按照调薪规则写 update 语句:


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


微信图片_20220510162020.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;


微信图片_20220510162110.png


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

相关文章
|
7月前
|
分布式计算 关系型数据库 数据挖掘
实时数仓 Hologres产品使用合集之当使用动态分区管理功能按日期进行分区后,通过主键和segment_key进行时间范围查询性能变差是什么原因
实时数仓Hologres的基本概念和特点:1.一站式实时数仓引擎:Hologres集成了数据仓库、在线分析处理(OLAP)和在线服务(Serving)能力于一体,适合实时数据分析和决策支持场景。2.兼容PostgreSQL协议:Hologres支持标准SQL(兼容PostgreSQL协议和语法),使得迁移和集成变得简单。3.海量数据处理能力:能够处理PB级数据的多维分析和即席查询,支持高并发低延迟查询。4.实时性:支持数据的实时写入、实时更新和实时分析,满足对数据新鲜度要求高的业务场景。5.与大数据生态集成:与MaxCompute、Flink、DataWorks等阿里云产品深度融合,提供离在线
|
4月前
|
SQL 存储 UED
系统里这个同时查冷热表的sql,动动手指,从8s降到3s
系统将交易数据按交易时间分为热表(最近3个月)和冷表(3个月前)。为保证用户体验,当企业门户端查询跨越冷热表时,尤其针对大客户,查询性能优化至关重要。以下是程序的SQL查询语句及其优化版本。
44 1
|
5月前
|
SQL 分布式计算 关系型数据库
实时数仓 Hologres操作报错合集之指定主键更新模式报错主键数据重复,该如何处理
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
5月前
|
SQL 数据处理 数据库
SQL进阶之路:深入解析数据更新与删除技巧——掌握批量操作、条件筛选、子查询和事务处理,提升数据库维护效率与准确性
【8月更文挑战第31天】在数据库管理和应用开发中,数据的更新和删除至关重要,直接影响数据准确性、一致性和性能。本文通过具体案例,深入解析SQL中的高级更新(UPDATE)和删除(DELETE)技巧,包括批量更新、基于条件的删除以及使用子查询和事务处理复杂场景等,帮助读者提升数据处理能力。掌握这些技巧能够有效提高数据库性能并确保数据一致性。
121 0
|
5月前
|
SQL 存储 数据挖掘
"SQL JOIN大揭秘:解锁多表联合查询的终极奥义,从内到外,左至右,全连接让你数据世界畅通无阻!"
【8月更文挑战第31天】在数据库领域,数据常分散在多个表中,而SQL JOIN操作如同桥梁,连接这些孤岛,使数据自由流动,编织成复杂的信息网络。本文通过对比内连接、左连接、右连接和全连接的不同类型,并结合示例代码,展示SQL JOIN的强大功能。掌握JOIN技术不仅能高效查询数据,更是数据分析和数据库管理的关键技能。
147 0
|
8月前
|
SQL 分布式计算 DataWorks
实时数仓 Hologres产品使用合集之在主键重复写入时无法保证保留最后一条记录如何解决
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
119 0
|
SQL 存储 分布式数据库
分库分表索引设计:二级索引、全局索引的最佳设计实践
对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。
|
SQL 存储 分布式数据库
分库分表索引设计:分布式环境下的 主键索引、二级索引、全局索引的最佳设计实践
分库分表索引设计:分布式环境下的 主键索引、二级索引、全局索引的最佳设计实践
136 0
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
本篇文章讲解的主要内容是:***如果有重复数据如何检查出两个表中的差异数据及对应条数、表连接做聚合容易出现重复计算的错误、多表查询空值处理问题、NOT IN的子查询范围不能是空值,否则查询结果为空。***
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
|
SQL 缓存 数据库
理论:第三章:索引使用的限制条件,sql优化有哪些,数据同步问题(缓存和数据库),缓存优化
理论:第三章:索引使用的限制条件,sql优化有哪些,数据同步问题(缓存和数据库),缓存优化
141 0