【SQL系列】多表关联更新

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

  • 深入解析 SQL 更新操作:从基础语法到最佳实践
    • 一、UPDATE 语句基础解析
    • 二、表别名与列引用
    • 三、SET 子句详解
    • 四、FROM 子句与多表更新
    • 五、WHERE 条件深度分析

深入解析 SQL 更新操作:从基础语法到最佳实践

SQL(结构化查询语言)是数据库管理的核心工具,而 UPDATE 语句作为其中最常用的操作之一,在数据维护和业务逻辑实现中扮演着关键角色。
在这里插入图片描述

一、UPDATE 语句基础解析

我们首先来看这个示例 SQL 语句:

UPDATE table_01 dst
SET tenant_id   = src."tenantId", "updatedAt" = CURRENT_TIMESTAMP(3)
FROM table_02 src
WHERE dst.user_id IS NOT NULLAND dst.user_id = src.uidAND dst.tenant_id IS DISTINCT FROM src."tenantId";

这是一个典型的基于多表关联的更新操作,主要功能是将 table_01 中的 tenant_id 字段更新为 table_02 中对应记录的"tenantId"值,同时更新修改时间戳。

UPDATE 语句的基本结构包含以下几个关键部分:

  1. 目标表指定(table_01 dst)
  2. SET 子句定义要更新的列和新值
  3. FROM 子句指定数据来源表
  4. WHERE 子句定义更新条件

这种形式的 UPDATE 语句在 PostgreSQL、SQL Server 等数据库中常见,但在 MySQL 中语法略有不同,通常使用 JOIN 替代 FROM。

二、表别名与列引用

示例中使用了表别名(dst 和 src),这是 SQL 中提高可读性的重要技巧。通过为表指定简短的别名,可以简化列引用并减少语句长度。例如:

dst.user_id比完整的table_01.user_id更加简洁明了。

值得注意的是,示例中出现了两种不同风格的列名引用:

  • 不加引号的常规标识符(tenant_id, user_id)
  • 加引号的特殊标识符(“tenantId”, “updatedAt”)

这种差异通常反映了底层数据库设计中的命名规范不一致问题。在 SQL 标准中,不加引号的标识符通常不区分大小写,而加引号的标识符则保留原始大小写。在实际项目中,建议统一命名风格以避免混淆。

三、SET 子句详解

SET 子句定义了要更新的列及其新值。本例中有两个更新操作:

  1. tenant_id = src."tenantId":将目标表的 tenant_id 设置为源表的 tenantId 值
  2. "updatedAt" = CURRENT_TIMESTAMP(3):将 updatedAt 字段设置为当前时间,精确到毫秒(3 位小数)

CURRENT_TIMESTAMP 函数在不同数据库中的实现略有差异:

  • PostgreSQL 和 Oracle 支持精度参数(如(3)表示毫秒)
  • MySQL 也支持类似语法,但参数位置略有不同
  • SQL Server 使用 GETDATE()或 SYSDATETIME()

在实际应用中,记录数据的最后修改时间是一种常见的最佳实践,有助于数据审计和问题追踪。

四、FROM 子句与多表更新

与传统单表 UPDATE 不同,本例使用了 FROM 子句引入第二个表(table_02)作为数据来源。这种多表更新语法在以下场景特别有用:

  • 根据关联表的值更新目标表
  • 需要从多个表获取信息来决定更新值
  • 批量更新基于复杂条件的记录

在 MySQL 中,等效操作通常使用 JOIN 语法:

UPDATE table_01 dst
JOIN table_02 src ON dst.user_id = src.uid
SET dst.tenant_id = src."tenantId", dst."updatedAt" = CURRENT_TIMESTAMP(3)
WHERE dst.user_id IS NOT NULLAND dst.tenant_id IS DISTINCT FROM src."tenantId";

五、WHERE 条件深度分析

WHERE 子句是 UPDATE 语句中最关键的部分之一,它决定了哪些记录会被修改。本例中的条件包含三个部分:

  1. dst.user_id IS NOT NULL:确保只处理 user_id 不为空的记录
  2. dst.user_id = src.uid:关联条件,确保只更新匹配的记录
  3. dst.tenant_id IS DISTINCT FROM src."tenantId":确保只更新实际需要修改的记录

第三个条件特别值得关注,它使用了IS DISTINCT FROM操作符,这是一个比普通不等号(!=或<>)更安全的比较方式,因为它能正确处理 NULL 值:

  • 普通比较:NULL = NULL 结果是 NULL(不是 TRUE)
  • IS DISTINCT FROM:NULL IS DISTINCT FROM NULL 结果是 FALSE

这种写法避免了不必要的更新,提高了语句效率,是 SQL 优化的重要技巧。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

C++进阶学习:STL常用容器--map/multimap容器

1. map 容器基本概念 map 中所有元素都是 pair pair 中第一个元素为 key &#xff08;键值&#xff09; 起到索引运用 第二个元素为 value&#xff08;实值&#xff09; 所有元素都会根据元素的键值自动排序 本质&#xff1a; map/multimap 属于关联式容器 底层结构是用二…

let,const,var关键字的区别

let,const,var关键字 let&#xff0c;const&#xff0c;var都存在变量提升 它们都存在变量提升但是稍微有点不同 var变量声明会被提升到作用域的顶部&#xff0c;并且会被初始化为 undefinedlet 和 const&#xff1a;变量声明也会被提升到作用域的顶部&#xff0c;但不会被初…

Nuitka 已经不再安全? Nuitka/Cython 打包应用逆向工具 -- pymodhook

pymodhook是一个记录任意对Python模块的调用的库&#xff0c;用于Python逆向分析。 pymodhook库类似于Android的xposed框架&#xff0c;但不仅能记录函数的调用参数和返回值&#xff0c;还能记录模块的类的任意方法调用&#xff0c;以及任意派生对象的访问&#xff0c;基于pyob…

path环境变量满了如何处理,分割 PATH 到 Path1 和 Path2

要正确设置 Path1 的值&#xff0c;你需要将现有的 PATH 环境变量 中的部分路径复制到 Path1 和 Path2 中。以下是详细步骤&#xff1a; 步骤 1&#xff1a;获取当前 PATH 的值 打开环境变量窗口&#xff1a; 按 Win R&#xff0c;输入 sysdm.cpl&#xff0c;点击 确定。在 系…

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(一)

1 目的 物料(例如晶圆)加工在设备中的自动化管理与控制是实现工厂自动化的关键要素。本标准针对半导体制造环境中与设备内部物料处理相关的通信需求进行了规范。本标准规定了在加工单元接收到的指定材料所应适用的加工方法(例如Etch腔室需要Run哪支Recipe)。它阐述了物料加工的…

【Hadoop】集群搭建实战:超详细保姆级教程

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Hadoop简介 2、Hadoop集群概念 3、 Hadoop 集…

阿里云人工智能大模型通义千问Qwen3开发部署

本文主要描述阿里云人工智能大模型开源社区ModelScope提供的通义千问Qwen3开发部署。 与阿里云一起 轻松实现数智化 让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;…

24.(vue3.x+vite)引入组件并动态挂载(mount)

示例截图 组件代码: <template><div><div>{{message }}</div>

《Python星球日记》 第56天:循环神经网络(RNN)入门

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、序列数据的特点与挑战1. 什么是序列数据?2. 序列数据的挑战二、RNN 的基本结构与前向传播1. RNN的核心理念2. RNN的数学表达3. RNN的前向传…

手写 vue 源码 === computed 实现

目录 计算属性的基本概念 计算属性的核心实现 ComputedRefImpl 类的实现 ReactiveEffect 与计算属性的关系 计算属性的工作流程 1. 创建计算属性 2. 依赖收集过程 3. 嵌套 effect 的处理 4. 更新过程 嵌套 effect 关系图解 依赖关系建立过程 代码实现分析 1. 创建…

【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决

在Vivado中在always块中写逻辑时如果出现always块中的异步复位敏感词在块内部未使用的情况&#xff0c;如下例的rst&#xff1a; always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…

【hadoop】Sqoop数据迁移工具的安装部署

一、Sqoop安装与配置 步骤&#xff1a; 1、使用XFTP将Sqoop安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 3、修改文件夹的名字&#xff0c;将其改为s…

BUUCTF——PYWebsite

BUUCTF——PYWebsite 进入靶场 看看基本信息 没有什么信息 扫个目录看看 http://node5.buuoj.cn:28115/.DS_Store http://node5.buuoj.cn:28115/flag.php http://node5.buuoj.cn:28115/index.html访问flag.php 提示保存购买者的IP 抓包看看 直接XFF伪造一下 X-Forwarded-F…

基于Qt开发的多线程TCP服务端

目录 一、Qt TCP服务端开发环境准备1. 项目配置2. 核心类说明二、服务端搭建步骤详解步骤1:初始化服务端对象步骤2:启动端口监听步骤3:处理客户端连接三、数据通信与状态管理1. 数据收发实现2. 客户端状态监控四、进阶功能扩展1. 多客户端并发处理2. 心跳检测机制五、调试与…

【Tools】VScode使用CMake构建项目

这里写目录标题 vscode 使用 CMake**安装插件**新建CMake项目 vscode 使用 CMake 安装插件 CMake和CMake Tools c等等 CMake插件主要功能是CMake语法高亮、自动补全CMake Tools的功能主要是结合VSCode IDE使用CMake这个工具&#xff0c;比如生成CMake项目、构建CMake项目等…

neo4j图数据库基本概念和向量使用

一.节点 1.新建节点 create (n:GroupProduct {name:都邦高保额团意险,description: "保险产品名称"} ) return n CREATE&#xff1a;Neo4j 的关键字&#xff0c;用于创建新节点或关系。 (n:GroupProduct)&#xff1a; n 是节点的临时别名&#xff08;变量名&#…

2025年渗透测试面试题总结-渗透测试红队面试八(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 渗透测试红队面试八 二百一十一、常见中间件解析漏洞利用方式 二百一十二、MySQL用户密码存储与加密 …

大语言模型主流架构解析:从 Transformer 到 GPT、BERT

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…

Java设计模式之装饰器模式:从基础到高级的全面解析(万字解析)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 一、装饰器模式基础概念 1.1 什么是装饰器模式 装饰…

RN 鸿蒙混合开发实践(踩坑)

#三方框架# #React Native # 1 。环境配置&#xff1b; 安装 DevEco 开发工具&#xff1b; Node 版本16&#xff1b; hdc环境配置 hdc 是 OpenHarmony 为开发人员提供的用于调试的命令行工具&#xff0c;鸿蒙 React Native 工程使用 hdc 进行真机调试。hdc 工具通过 OpenHa…