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

在实际的数据库管理和开发中,经常需要临时存储中间计算结果或对多表数据进行批量更新。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.rhkb.cn/news/496959.html

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

相关文章

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题,导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下,方面后面查阅,大家还有问题的可以在此讨…

柒拾捌- 如何通过数据影响决策(六)- 放大再放大

1、整体带来的错觉 当我们观察宏观的数据时,常常会发现有些东西 无法理解。例如为什么人人都说楼价在跌,但公布的楼价数据却在涨?例如为什么经济感受那么差,宏观数据却还是在涨? 如果我们只在于 某个粒度 的数据&…

sql group by 多个字段例子

有表如下; 获取某年份、某地区、某产品的销售总额, 或者根据需要把字段顺序换一下; insert into sales (product, year, region, amount) values (飞机,2000,东部,5); insert into sales (product, year, region, amount) values (飞机,2001,…

在Windows上读写Linux磁盘镜像的一种方法

背景 嵌入式开发中,经常会把系统的Linux磁盘镜像保存到Windows上,以便上传到网盘备份或发送给工厂,但是如果想读取/修改镜像中的某个文件,一般有2种方案: 直接访问 就是用虚拟磁盘软件将镜像文件挂载成磁盘&#xf…

uniapp开发微信小程序实现获取“我的位置”

1. 创建GetLocation项目 使用HBuilder X创建一个项目GetLocation,使用Vue3。 2. 在腾讯地图开放平台中创建应用 要获取位置,在小程序中需要使用腾讯地图或是高德地图。下面以腾讯地图为例。 (1)打开腾讯地图开放平台官方网址:腾讯位置服务 - 立足生态,连接未来 (2)注册…

XXE漏洞 黑盒测试 白盒测试 有无回显问题

前言 什么是XXE(xml外部实体注入漏洞)? 就是网站以xml传输数据 的时候我们截取他的传输流进行修改(网站没有对我们的输入进行过滤) 添加恶意代码 导致数据传输到后台 后台解析xml形式 导致恶意代码被执行 几种常见的…

《数据结构》期末考试测试题【上】

数据结构测试题 1.数据结构是指什么?2.某语句时间复杂为?3.关于数据结构的说法那个正确?4.一个算法的评价标准包括哪些方面?5.时间复杂度指的是什么?6.算法的重要特征有那些?7.某语句时间复杂为?8.存储数据…

PCA降维MATLAB代码解释及应用场景

代码整体功能概述 这段代码主要实现了以下几个功能:首先读取两个 CSV 文件中的数据,对数据进行归一化处理后合并,接着绘制原始数据的散点图进行可视化展示,然后应用主成分分析(PCA)算法对合并后的数据进行…

JVM学习-内存结构(一)

一、引言 学前了解: 1.什么是JVM 1.1定义 Java Virtual Machine ,Java 程序的运行环境(Java 二进制字节码的运行环境)。 好处 一次编译,处处执行 自动的内存管理,垃圾回收机制 数组下标越界检查 比较…

【C++】统计正整数的位数:题目解析与代码优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述**题目要求:统计正整数的位数** 💯我的代码实现**核心逻辑解析** 💯老师的代码实现**老师代码逻辑解析** 💯我的代码…

QML学习(五) 做出第一个简单的应用程序

今天先尝试做出第一个单页面的桌面应用程序。 1.首先打开Qt,创建项目,选择“QtQuick Application - Empty” 空工程。 2.设置项目名称和项目代码存储路径 3.这里要注意选择你的编译器类型,以及输出的程序时32位还是64位。 4.然后一路下一步生成项目框…

光谱相机与普通相机的区别

一、成像目的 普通相机:主要目的是记录物体的外观形态,生成人眼可见的、直观的二维图像,重点在于还原物体的形状、颜色和纹理等视觉特征,以供人们进行观赏、记录场景或人物等用途。例如,拍摄旅游风景照片、人物肖像等…

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…

【畅购电商】项目总结

目录 1. 电商项目架构图 1.1 系统架构 1.2 技术架构 2. 介绍电商项目 2.1 后台和前台、后端和前端 2.2 Vue全家桶包含哪些技术? 2.3 什么是Vuex? 2.4 什么是SSR 2.5 电商模式是什么? 2.6 枚举类 2.7 elasticsearch相关 2.8 gatew…

开源的go语言统一配置中心 - nacos + nacos go sdk

配置文件实时更新机制的场景需求 配置文件热更新主要应用于需要在不停机的情况下动态调整系统行为的场景,例如修改服务参数、切换数据源等。其原理在于通过一个中心化的管理平台来存储和分发最新的配置信息。当配置文件发生变化时,该平台会主动或被动地…

Redis--如何保障缓存数据库一致性?(面试高频问题)

如何保障缓存数据库一致性? 数据库和缓存不一致采用什么方案?实现商铺和缓存与数据库双写一致背景点评项目使用了什么策略? 存在什么问题?延迟双删(强一致场景)分布式锁(强一致场景)…

【Python系列】Python 连接 PostgreSQL 数据库并查询数据

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

Spring5.1.3 @Autorwired注解原理重新回顾

直接用一些例子代码说明Autorwired的工作原理,Spring版本为5.1.3 。 一般认为Autorwired是自动注入的,但实际不是,和byName, byType等自动注入没有任何关系。 Ca & Cb & Cc 三个类 Ca public class Ca {public Ca(){System.out.p…

Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件,”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件” BiliBili视频链接: Linux shell脚本对常见图片格式批量转换…

Linux应用软件编程-多任务处理(进程)

多任务:让系统具备同时处理多个事件的能力。让系统具备并发性能。方法:进程和线程。这里先讲进程。 进程(process):正在执行的程序,执行过程中需要消耗内存和CPU。 进程的创建:操作系统在进程创…