热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL跨表查询与跨表更新

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

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

背景

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

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

憨B SQL 直接被秒杀

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

MySQL跨表查询与跨表更新

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

MySQL跨表查询与跨表更新

看到这个 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-员工表」

MySQL跨表查询与跨表更新

建表语句如下:

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

MySQL跨表查询与跨表更新

建表语句如下:

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);

MySQL跨表查询与跨表更新

调薪规则:

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

按照调薪规则写 update 语句:

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

MySQL跨表查询与跨表更新

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

三横一竖一咕嘎,四个小猪🐷来吃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;

MySQL跨表查询与跨表更新

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


推荐阅读
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 数据库多表联合查询:内连接与外连接详解
    在数据库的多表查询中,内连接和外连接是两种常用的技术手段。内连接用于检索多个表中相互匹配的记录,即只有当两个表中的记录满足特定的连接条件时,这些记录才会被包含在查询结果中。相比之下,外连接则不仅返回匹配的记录,还可以选择性地返回不匹配的记录,具体取决于左外连接、右外连接或全外连接的选择。本文将详细解析这两种连接方式的使用场景及其语法结构,帮助读者更好地理解和应用多表查询技术。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 优化后的标题:Apache Cassandra数据写入操作详解
    本文详细解析了 Apache Cassandra 中的数据写入操作,重点介绍了 INSERT 命令的使用方法。该命令主要用于将数据插入到指定表的列中,其基本语法为 `INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...)`。通过具体的示例和应用场景,文章深入探讨了如何高效地执行数据写入操作,以提升系统的性能和可靠性。 ... [详细]
author-avatar
CC2502916775_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有