SQL 实战:动态表创建与多表更新的高级 SQL

news2025/1/4 19:20:56

在实际的数据库管理和开发中,经常需要临时存储中间计算结果或对多表数据进行批量更新。SQL 提供了动态表创建和多表更新的能力,使复杂业务逻辑能够通过一条 SQL 语句高效完成。本文将介绍如何动态创建临时表和实现多表联动更新,并通过具体示例展示高级 SQL 技巧。


一、核心知识点概览

功能说明示例
CREATE TEMPORARY TABLE创建临时表,存储查询结果或临时数据创建临时用户表补充缺失地址
MERGE INTO条件匹配更新或插入,适合批量数据同步根据外部表批量更新用户表
UPDATE JOIN使用 JOIN 关联更新多表更新缺少邮编的用户地址
INSERT INTO SELECT通过查询结果插入表中将缺失数据插入用户表

二、实战案例


案例 1:批量更新缺失的邮编信息

场景描述
在用户管理系统中,users 表中部分用户缺少邮编信息,而 address_mapping 表中维护了完整的地址与邮编的对应关系。我们希望批量补充用户表中缺失的邮编信息。


表结构

用户表 users

user_idnameaddresszipcode
1张三北京市海淀区NULL
2李四上海市浦东新区200120
3王五广州市天河区NULL

地址映射表 address_mapping

addresszipcode
北京市海淀区100080
广州市天河区510630
深圳市福田区518000

方法 1:UPDATE JOIN 实现批量更新
UPDATE users u  
JOIN address_mapping a  
ON u.address = a.address  
SET u.zipcode = a.zipcode  
WHERE u.zipcode IS NULL;

结果

user_idnameaddresszipcode
1张三北京市海淀区100080
2李四上海市浦东新区200120
3王五广州市天河区510630

解释

  • 使用 JOINusersaddress_mapping 表关联起来,根据地址字段匹配。
  • 只更新 zipcodeNULL 的记录。

方法 2:MERGE INTO 实现批量更新

(适用于 SQL Server、Oracle)

MERGE INTO users u  
USING address_mapping a  
ON u.address = a.address  
WHEN MATCHED AND u.zipcode IS NULL  
THEN UPDATE SET u.zipcode = a.zipcode;

解释

  • MERGE INTO 是 SQL Server 和 Oracle 常用的批量更新或插入的方式。
  • 当地址匹配并且邮编为空时,执行更新操作。


案例 2:动态创建临时表,补充缺失数据

场景描述
某公司需要为即将过生日的用户发送优惠券。用户信息存储在 users 表中,但部分用户缺失出生日期。通过参考 external_users 表(外部用户表),希望补充 users 表中缺失的生日信息。


表结构

用户表 users

user_idnamebirthday
1张三NULL
2李四1990-05-01
3王五NULL

外部用户表 external_users

user_idbirthday
11985-12-10
31992-07-15

步骤 1:创建临时表并插入外部用户数据
CREATE TEMPORARY TABLE temp_birthdays AS  
SELECT user_id, birthday  
FROM external_users;

结果(临时表):

user_idbirthday
11985-12-10
31992-07-15

步骤 2:更新 users 表中的生日信息
UPDATE users u  
JOIN temp_birthdays t  
ON u.user_id = t.user_id  
SET u.birthday = t.birthday  
WHERE u.birthday IS NULL;

结果

user_idnamebirthday
1张三1985-12-10
2李四1990-05-01
3王五1992-07-15

解释
  • 临时表:使用 CREATE TEMPORARY TABLE 语句创建一个基于外部用户数据的临时表。
  • 批量更新:通过 JOIN 临时表和用户表,补充缺失的生日信息。
  • 作用范围:临时表只在当前会话中有效,查询结束后自动销毁。


案例 3:INSERT INTO SELECT 实现数据补充

场景描述
部分用户尚未注册到系统中,我们需要将外部系统的用户数据补充到用户表中,避免遗漏。


SQL 实现
INSERT INTO users (user_id, name)  
SELECT user_id, name  
FROM external_users  
WHERE user_id NOT IN (SELECT user_id FROM users);

解释

  • INSERT INTO SELECT 可以将外部表中不存在于主表的数据批量插入到用户表中。
  • NOT IN 子查询确保只插入未注册的用户。

四、多表更新优化与注意事项

1. 使用索引提升 JOIN 性能

在大数据量场景中,关联更新涉及表扫描,建议在关联字段上创建索引提升查询速度。

CREATE INDEX idx_address ON users(address);  
CREATE INDEX idx_address_mapping ON address_mapping(address);

2. 避免子查询嵌套更新

在批量更新中,尽量避免在 UPDATE 子查询中嵌套 SELECT,使用 JOIN 可显著提升性能。


五、总结

  • 动态表创建:使用 CREATE TEMPORARY TABLE 临时存储中间数据,提高复杂查询效率。
  • 多表更新:通过 UPDATE JOINMERGE 批量更新表中缺失的数据,避免逐行更新。
  • 数据补充:利用 INSERT INTO SELECT 实现跨表数据迁移与补充,简化数据同步流程。
  • 优化建议:合理使用索引和 JOIN 优化多表更新,避免子查询嵌套导致性能瓶颈。

通过这些高级 SQL 技巧,可以高效解决多表更新、动态表创建以及复杂数据清洗问题,提高数据库操作的自动化程度和性能。

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

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

相关文章

WordPress网站中如何修复504错误

504网关超时错误是非常常见的一种网站错误。这种错误发生在上游服务器未能在规定时间内完成请求的情况下,对访问者而言,出现504错误无疑会对访问体验大打折扣,从而对网站的转化率和收入造成负面影响。 504错误通常源于服务器端或网站本身的问…

Springboot 升级带来的Swagger异常

当升级到Springboot 2.6.0 以上的版本后,Swagger 就不能正常工作了, 启动时报如下错误。当然如果你再使用sping boot Actuator 和 Springfox, 也会引起相关的NPE error. (github issue: https://github.com/springfox/springfox/issues/3462) NFO | jvm 1 | 2022/04…

发现API安全风险,F5随时随地保障应用和API安全

分析数据显示,目前超过90%的基于Web的网络攻击都以API端点为目标,试图利用更新且较少为人所知的漏洞,而这些漏洞通常是由安全团队未主动监控的API所暴露。现代企业需要一种动态防御策略,在风险升级成代价高昂、令人警惕且往往无法…

【数据结构】(Python)差分数组。差分数组与树状数组结合

差分数组: 基于原数组构造的辅助数组。用于区间修改、单点查询。区间修改的时间复杂度O(1)。单点查询的时间复杂度O(n)。差分数组的元素:第一个元素等于原数组第一个元素,从第二个元素开始是原数组对应下标的元素与前一个元素的差&#xff0…

12.30-1-5学习周报

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 文章链接摘要Abstract一、方法介绍1.HAT-CIR2.Horde3.DWGRNet 二、实验总结 文章链接 https://arxiv.org/pdf/2405.04101 摘要 本博客介绍了论文《Continual lea…

Android OpenGl(二) Shader

一、Shader 1、什么是Shader,为什么要使用Shder (1)shader运行在gpu上的小程序 (2)以前使用固定管线,但缺点是灵活度不够,无法满足复杂需求,为了解决固定管线的缺点,出…

【LeetCode】200、岛屿数量

【LeetCode】200、岛屿数量 文章目录 一、并查集1.1 并查集1.2 多语言解法 二、洪水填充 DFS2.1 洪水填充 DFS 一、并查集 1.1 并查集 // go var sets int var father [90000]intfunc numIslands(grid [][]byte) int {n, m : len(grid), len(grid[0])build(grid, n, m)for i …

[最佳方法] 如何将视频从 Android 发送到 iPhone

概括 将大视频从 Android 发送到 iPhone 或将批量视频从 iPhone 传输到 Android 并不是一件容易的事情。也许您已经尝试了很多关于如何将视频从 Android 发送到 iPhone 15/14 的方法,但都没有效果。但现在,通过本文中的这 6 种强大方法,您可…

MetaRename for Mac,适用于 Mac 的文件批量重命名工具

在处理大量文件时,为每个文件手动重命名既耗时又容易出错。对于摄影师、设计师、开发人员等需要频繁处理和整理文件的专业人士来说,找到一款能够简化这一过程的工具是至关重要的。MetaRename for Mac 就是这样一款旨在提高工作效率的应用程序&#xff0c…

QEMU网络配置简介

本文简单介绍下qemu虚拟机网络的几种配置方式。 通过QEMU的支持,常见的可以实现以下4种网络形式: 基于网桥(bridge)的虚拟网络。基于NAT(Network Addresss Translation)的虚拟网络。QEMU内置的用户模式网…

Elasticsearch向量检索需要的数据集以及768维向量生成

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang) Elasticsearch检索之三:官方推荐方案search_after…

MySQL:安装配置(完整教程)

这里写目录标题 一、MySQL 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1 初始化 MySQL5.2 启动 MySQL 服务 六、修改 MySQL 密码七、卸载 MySQL八、结语 一、MySQL 简介 MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS)…

您的公司需要小型语言模型

当专用模型超越通用模型时 “越大越好”——这个原则在人工智能领域根深蒂固。每个月都有更大的模型诞生,参数越来越多。各家公司甚至为此建设价值100亿美元的AI数据中心。但这是唯一的方向吗? 在NeurIPS 2024大会上,OpenAI联合创始人伊利亚…

如何用CSS3创建圆角矩形并居中显示?

在网页设计中,圆角矩形因其美观和现代感而被广泛使用,居中显示元素也是一个常见的需求。今天,我们将学习如何使用CSS3的border-radius属性来创建圆角矩形,并将其居中显示在页面上。 如果你正在学习CSS,那么这个实例将非…

PhPMyadmin-cms漏洞复现

一.通过日志文件拿Shell 打开靶场连接数据库 来到sql中输入 show global variables like %general%; set global general_logon; //⽇志保存状态开启; set global general_log_file D:/phpstudy/phpstudy_pro/WWW/123.php //修改日志保存位置 show global varia…

本地LLM部署--llama.cpp

–图源GitHub项目主页 概述 llama.cpp是以一个开源项目(GitHub主页:llamma.cpp),也是本地化部署LLM模型的方式之一,除了自身能够作为工具直接运行模型文件,也能够被其他软件或框架进行调用进行集成。 其…

基本算法——分类

目录 创建项目 导入依赖 加载数据 特征选择 学习算法 对新数据分类 评估与预测误差度量 混淆矩阵 通过模型的预测结果生成 ROC 曲线数据 选择分类算法 完整代码 结论 创建项目 首先创建spring boot项目,我这里用的JDK8,springboot2.7.6&…

【系统配置】3种方式修改用户登录显示名|统信|麒麟|方德

原文链接:【系统配置】3种方式修改用户登录显示名|统信|麒麟|方德 Hello,大家好啊!今天给大家带来一篇关于 通过修改 /etc/passwd 文件、usermod 命令,以及图形化界面三种方式修改用户登录名 的…

TTL 传输中过期问题定位

问题: 工作环境中有一个acap的环境,ac的wan口ip是192.168.186.195/24,ac上lan上有vlan205,其ip子接口地址192.168.205.1/24,ac采用非nat模式,而是路由模式,在上级路由器上有192.168.205.0/24指向…

Cocos2dx Lua绑定生成中间文件时参数类型与源码类型不匹配

这两天维护的一个项目&#xff0c;使用arm64-v8a指令集编译时遇到了报错&#xff0c;提示类型不匹配&#xff0c;具体报错的代码【脚本根据C源文件生成的中间文件】如下&#xff1a; const google::protobuf::RepeatedField<unsigned long long>& ret cobj->equi…