MySQL 中的 UNION 语句
文章目录
- 一、数据准备
- 一、UNION 和 UNION ALL
- 二、UNION 的执行顺序(UNION 和其他语句一同出现)
- 三、MySQL 使用 UNION(ALL) + ORDER 导致排序失效
- 四、UNION 报错语法
一、数据准备
-- 创建表
CREATE TABLE test_user (ID int(11) NOT NULL AUTO_INCREMENT,USER_ID int(11) DEFAULT NULL COMMENT '用户账号',USER_NAME varchar(255) DEFAULT NULL COMMENT '用户名',AGE int(5) DEFAULT NULL COMMENT '年龄',COMMENT varchar(255) DEFAULT NULL COMMENT '简介',PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;-- 数据插入语句
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('1', '111', '开心菜鸟', '18', '今天很开心');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('2', '222', '悲伤菜鸟', '21', '今天很悲伤');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('3', '333', '认真菜鸟', '30', '今天很认真');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('4', '444', '高兴菜鸟', '18', '今天很高兴');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('5', '555', '严肃菜鸟', '21', '今天很严肃');
SELECT * FROM test_user u;
一、UNION 和 UNION ALL
UNION
连接数据集关键字,可以将两个查询结果集拼接为一个,会过滤掉相同的记录
UNION ALL
连接数据集关键字,可以将两个查询结果集拼接为一个,不会过滤掉相同的记录
-- 使用UNION
SELECT * FROM test_user u
UNION
SELECT * FROM test_user u;
使用 UNION ,可以看到查询结果只有 5 条数据。
-- 使用UNION ALL
SELECT * FROM test_user u
UNION ALL
SELECT * FROM test_user u;
使用 UNION ALL,可以看到查询结果有 10 条数据。
二、UNION 的执行顺序(UNION 和其他语句一同出现)
from—>on—>join—>where—>group by—>having+(聚合函数)—>select—>distinct—>UNION—>order by—>limit
UNION 的执行顺序在 ORDER BY 之前
请记住这个执行顺序,便可以知道 UNION 和其他语句一同出现的结果。
- UNION 和 WHERE 语句
-- 1、第二个子句中的 where 语句不能同时作用于两个select语句
-- 5 + 1,共计 6 条
SELECT *, 'table1' FROM test_user u
UNION ALL
SELECT *, 'table2' FROM test_user u WHERE AGE = 30;
UNION 在 where 之后,所以第二个表的WHERE先筛选后进行数据集拼接;
如果想要把 where 作用所有结果集,可以通过再嵌套一个 select 。
-- 1、第二个子句中的 where 语句不能同时作用于两个select语句
-- 1 + 1,共计 2 条
-- 写法 1
SELECT * FROM
(SELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u
) a
WHERE AGE = 30;
-- 或者使用写法 2
SELECT *, 'table1' FROM test_user u WHERE AGE = 30
UNION ALL
SELECT *, 'table2' FROM test_user u WHERE AGE = 30
;
- UNION 和 GROUP 语句
-- 2、第二个子句中的 group by 语句不能同时作用于两个select语句
-- 5 + 3,共计 8 条
SELECT *, 'table1' FROM test_user u
UNION ALL
SELECT *, 'table2' FROM test_user u GROUP BY AGE;
UNION 在 GROUP BY 之后,所以 table2 的 GROUP BY 先分组后进行数据集拼接;
2. UNION 和 HAVING 语句
-- 3、第二个子句中的 HAVING 语句不能同时作用于两个 select 语句
-- 5 + 1,共计 6 条
SELECT *, 'table1' FROM test_user u
UNION ALL
SELECT *, 'table2' FROM test_user u HAVING AGE = 30 ;
UNION 在 HAVING 之后,所以 table2 的 HAVING 先过滤后进行数据集拼接;
3. UNION 和 ORDER BY 语句
-- 4、第二个子句中的 order by 语句可以同时作用于两个select语句
-- 查询结果整体按照 age 进行了排序
SELECT *, 'table1' FROM test_user u
UNION ALL
SELECT *, 'table2' FROM test_user u ORDER BY AGE;
因为当 UNION(ALL)语句和 ORDER BY语句同时出现,UNION(ALL)语句先执行。
4. UNION 和 LIMIT 语句
-- 只有1条数据,因为LIMIT在UNION之后执行
SELECT *, 'table1' FROM test_user u
UNION ALL
SELECT *, 'table2' FROM test_user u limit 0,1;
只有1条数据,因为 LIMIT 在 UNION 之后执行。
- UNION 、 ORDER BY 和 LIMIT 语句
-- 5、第二个子句中的 order by ,LIMIT 语句同时作用于两个 select 语句 *********
-- 只有1条数据,age=30 UNION--->ORDER BY--->LIMIT
SELECT *, 'table1' FROM test_user u
UNION ALL
SELECT *, 'table2' FROM test_user u order by age desc limit 0,1;
先拼接数据集,在按照 age 排序,最后使用 LIMIT 。
三、MySQL 使用 UNION(ALL) + ORDER 导致排序失效
通过以下两种方式解决:
- 添加 LIMIT 字段
- 额外增加排序字段
- SQL 1 如下
SELECT * FROM test_user u ORDER BY AGE;
2. SQL 2 如下
SELECT * FROM test_user u ORDER BY AGE DESC;
3. 查询结果集
(SELECT *, 'table1' FROM test_user u ORDER BY AGE)
UNION ALL
(SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC);
可以看到此时 ORDER BY 语句失效了。
原因:UNION(ALL) + 会使 ORDER 失效
- 解决办法(1): 添加 LIMIT
-- 都加上 LIMIT
( SELECT *, 'table1' FROM test_user u ORDER BY AGE limit 10)
UNION ALL
( SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC limit 10)
最好的解决方案就是先查询后排序,避免上述情况发生。
- 解决办法(2) :添加额外的排序字段
select * from
(( SELECT *, 'table1' AS name, row_number() over(ORDER BY AGE ) AS rn FROM test_user u ) UNION ALL ( SELECT *, 'table2' AS name, row_number() over(ORDER BY AGE DESC) AS rn FROM test_user u )
) a
order by name, rn;
额外需要两个字段,通过 row_number() over(order by column)进行表内排序,再通过 name 字段进行表排序。
四、UNION 报错语法
1. ORDER BY 语法报错
-- 语法错误
SELECT *, 'table1' FROM test_user u ORDER BY AGE
UNION ALL
SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC;
第一个 SELECT 语句也使用了 ORDER BY ,导致报错。
解决方案:第一个 SELECT 语句加上括号。
-- 语法正确
(SELECT *, 'table1' FROM test_user u ORDER BY AGE)
UNION ALL
SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC;
加上括号后,虽然不再报错,但是第一个 SELECT 语句的排序失效。
那要是上下两个都加上括号呢?
-- 语法正确
(SELECT *, 'table1' FROM test_user u ORDER BY AGE)
UNION ALL
(SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC);
语法不报错,但是两个排序都失效了。
原因大家也清楚,前面第三小节已经讲过了,UNION 在 ORDER BY 语句之前。
2. LIMIT 语法报错
同样对于 LIMIT 语句也是一样的。
-- 语法错误
SELECT *, 'table1' FROM test_user u limit 0,1
UNION ALL
SELECT *, 'table2' FROM test_user u limit 0,1;
解决方案:同样也是第一个 SELECT 语句加上括号。
-- 语法正确,1 条记录
(SELECT *, 'table1' FROM test_user u limit 0,1)
UNION ALL
SELECT *, 'table2' FROM test_user u limit 0,1;
此时语法正确,但只返回一行记录。
如果想要返回两条记录,就给第二个 SELECT 语句也加上括号。
-- 语法正确,2 条记录
(SELECT *, 'table1' FROM test_user u limit 0,1)
UNION ALL
(SELECT *, 'table2' FROM test_user u limit 0,1);
总结: UNION 后面执行的 ORDER BY,LIMIT 语句注意使用时要加括号,否则报错。
相关文章:
MySQL 中的 UNION 语句
文章目录一、数据准备一、UNION 和 UNION ALL二、UNION 的执行顺序(UNION 和其他语句一同出现)三、MySQL 使用 UNION(ALL) ORDER 导致排序失效四、UNION 报错语法一、数据准备 -- 创建表 CREATE TABLE test_user (ID int(11) NO…...
高完整性系统工程(三): Logic Intro Formal Specification
目录 1. Propositions 命题 2.1 Propositional Connectives 命题连接词 2.2 Variables 变量 2.3 Sets 2.3.1 Set Operations 2.4 Predicates 2.5 Quantification 量化 2.6 Relations 2.6.1 What Is A Relation? 2.6.2 Relations as Sets 2.6.3 Binary Relations as…...
【linux】多线程概念详述
文章目录一、线程基本概念1.1 进程地址空间与页表1.2 页表结构1.3 线程的理解1.3.1 如何描述线程1.4 再谈进程1.5 代码理解1.5.1 原生库提供线程pthread_create1.6 资源共享问题1.7 资源私有问题二、总结2.1 什么是线程2.2 并行与并发2.3 线程的优点2.4 线程的缺点2.5 线程异常…...
【Java】P8 面向对象(3)方法 基本知识
面向对象 方法方法方法的声明权限修饰符返回值类型方法名形参列表方法体简单案例方法 方法 是对类或对象行为特征的抽象,用来完成某个功能的操作。方法的目的 是为了实现代码复用,减少冗余,简化代码;方法不能独立存在,…...
js中null和undefined的区别
js中null和undefined的区别?这也是一个常见的js面试题 相同点 1,都是基本类型。 2,做判断值都是false。 !!null false // true !!undefined false // true不同点 1,诞生时间null在前,undefined在后。因为js作者Brendan-Eic…...
【Linux】linux中的c++怎么调试?gdb的介绍和使用。
背景1.1.前提知识程序的发布方式有两种,debug模式和release模式Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项windows上的调试方法有区别吗?1.调试思路是一样的2…...
提升Python代码性能的六个技巧
文章目录前言为什么要写本文?1、代码性能检测1.1、使用 timeit 库1.2、使用 memory_profiler 库1.3、使用 line_profiler 库2、使用内置函数和库3、使用内插字符串 f-string4、使用列表推导式5、使用 lru_cache 装饰器缓存数据6、针对循环结构的优化7、选择合适算法…...
VI的常用命令
VI的常用命令 文章目录VI的常用命令vi/vim是什么?VI普通模式命令VI编辑模式命令VI指令模式vi/vim是什么? VI是Unix操作系统和类Unix操作系统中最通用的文本编辑器 VIM编辑器是从VI发展出来的一个性能更强大的文本编辑器。可以主动的将字体颜色辨别语法…...
【数据结构】万字深入浅出讲解单链表(附原码 | 超详解)
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:C语言实现数据结构 💬总结:希望你看完…...
无线WiFi安全渗透与攻防(五)之aircrack-ng破解WEP加密
系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 无线WiFi安全渗透与攻防(二)之打造专属字典 无线WiFi安全渗透与攻防(三)之Windows扫描wifi和破解WiFi密码 无线WiFi安全渗透与攻防(四)之kismet的使用 aircrack-ng破解WEP加密 1.WEP介绍 其实我们平常在使用wifi的时…...
MySQL中事务的相关问题
事务 一、事务的概述: 1、事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit…...
推荐算法再次踩坑记录
去年搞通了EasyRec这个玩意,没想到今年还要用推荐方面的东西,行吧,再来一次,再次踩坑试试。1、EasyRec训练测试数据下载:git clone后,进入EasyRec,然后执行:bash scripts/init.sh 将…...
STM32 (十五)MPU6050
简介前言一、MPU6050简介MPU6050是一款性价比很高的陀螺仪,可以读取X Y Z 三轴角度,X Y Z 三轴加速度,还有内置的温度传感器,在姿态解析方面应用非常广泛。下面是它在淘宝上的参数图产品尺寸产品参数产品原理图:二、硬…...
使用yarn,依赖报各种错误怎么办
使用 yarn^3.x 版本时,默认并不会安装包到 node_modules,因为 yarn3.x 是即插即用的,也就是说如果你下载过这个包,yarn只会生成一个 Png文件,然后将包的路径 link 到下载过的地方,这样可以省去很多时间。而…...
面试官:rem和vw有什么区别
"rem" 和 "vw"的区别 "rem" 和 "vw" 都是用于网页设计的CSS单位。 "rem" 是相对于根元素的字体大小来计算的单位,即相对于 "html" 标签的字体大小。例如,如果 "html" 标签的字…...
【GPT-4】GPT-4 相关内容总结
目录 编辑 官网介绍 GPT-4 内容提升总结 GPT-4 简短版总结 GPT-4 基础能力 GPT-4 图像处理 GPT-4 技术报告 训练过程 局限性 GPT-4 风险和应对措施 开源项目:OpenAI Evals 申请 GPT-4 API API的介绍以及获取 官网介绍 官网:GPT-4 API候…...
5.springcloud微服务架构搭建 之 《springboot集成Hystrix》
1.springcloud微服务架构搭建 之 《springboot自动装配Redis》 2.springcloud微服务架构搭建 之 《springboot集成nacos注册中心》 3.springcloud微服务架构搭建 之 《springboot自动装配ribbon》 4.springcloud微服务架构搭建 之 《springboot集成openFeign》 目录 1.项目…...
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
去年10月份以来由于公司和家里的事情太多,所以一直没有学习,最近缓过来了,学习的脚步不能停滞啊。回归正题,其实前年在学习springMvc的时候也学习过Jackson【Spring MVC学习笔记 五】SpringMVC框架整合Jackson工具,但是…...
香港服务器遭受DDoS攻击后如何恢复运行?
您是否发现流量异常上升?您的网站突然崩溃了吗?当您注意到这些迹象时,可能是在陷入了DDoS攻击的困境,因而,当开始考虑使用香港服务器时,也应该考虑香港服务器设备受DDoS攻击时,如何从中恢复。 在 DDoS 攻击香港…...
【Hive】配置
目录 Hive参数配置方式 参数的配置方式 1. 文件配置 2. 命令行参数配置 3. 参数声明配置 配置源数据库 配置元数据到MySQL 查看MySQL中的元数据 Hive服务部署 hiveserver2服务 介绍 部署 启动 远程连接 1. 使用命令行客户端beeline进行远程访问 metastore服务 …...
IP-GUARD如何强制管控电脑设置开机密码要符合密码复杂度?
如何强制管控电脑设置开机密码要符合密码复杂度? 7 可以在控制台-【策略】-【定制配置】,添加一条配置,开启系统密码复杂度检测。 类别:自定义 关键字:bp_password_complexity 内容:1 效果图:...
剑指 Offer II 031. 最近最少使用缓存
题目链接 剑指 Offer II 031. 最近最少使用缓存 mid 题目描述 运用所掌握的数据结构,设计和实现一个 LRU(Least Recently Used,最近最少使用) 缓存机制 。 实现 LRUCache类: LRUCache(int capacity)以正整数作为容量 capacity初始化 LRU缓…...
44岁了,我从没想过在CSDN创作2年,会有这么大收获
1998年上的大学,02年毕业,就算从工作算起,我也有20余年的码龄生涯了。 但正式开启博文的写作,却是2021年开始的,差不多也就写了2年的博客,今天我来说说我在CSDN的感受和收获。 我是真的没想到,…...
相位相参信号源的设计--示波器上的信号不稳定,来回跑?
目录乱跑的波形边沿触发触发方式外部触发相参与非相参相位相参的射频信号源样机外观与内部设计软件设计上位机软件信号源使用方法PWM触发信号射频信号的时域波形射频信号的频谱输出功率在示波器的实际使用当中波形在示波器的时域上乱跑,左右移动,定不下来…...
Spring Boot 整合 RabbitMQ 多种消息模式
Spring Boot 整合 RabbitMQ 多种消息模式 准备工作集成 RabbitMQ发布/订阅模式点对点模式主题模式总结Spring Boot 是一个流行的 Java 应用程序开发框架,而 RabbitMQ 是一款可靠的消息队列软件。将 Spring Boot 和 RabbitMQ 结合起来可以帮助我们轻松地实现异步消息传递。Rabb…...
node多版本控制
前言 最近在折腾Python,并将node升级至v18.14.2。突然发现一个旧项目无法运行,也无法打包,里面的node-sass报错,显然这是因为node版本过高导致的。 将node版本降低至以前的v14.16.0,果然立马就能正常运行。 存在不同…...
Redis set集合
Redis set (集合)遵循无序排列的规则,集合中的每一个成员(也就是元素,叫法不同而已)都是字符串类型,并且不可重复。Redis set 是通过哈希映射表实现的,所以它的添加、删除、查找操作…...
漫画:什么是希尔排序算法?
希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错 一、排序思想 前情回顾:漫画:什么是插入排序算法…...
问卷工具选择要看哪些方面?
通常来讲,我们在使用一款问卷制作工具制作问卷时会有哪些需求呢? 一、用户需求 1、操作简单,易上手。 2、能够满足用户个性化的需求。 3、提供多语言服务。 4、能够帮助发布以及数据收集。 5、简化数据分析 市面上的问卷调查制作工具都…...
Qt之QPainter绘制多个矩形/圆形(含源码+注释)
一、绘制示例图 下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。 二、思路解释 绘制矩形需要自然要获取矩形数据,因此通过鼠标事件获取每个矩形的rect数…...
哪个网站做首饰批发好/seo网站建设优化什么意思
夜光序言: 流星坠落 湖面水波清越 远方 被你轻轻擦去的灰白 令人向往 月光照耀枝头 为谁停留 青年抬起头,深邃的眼眸中似乎有点感伤,但是他紧握的双手似也表明着他的决心 俄罗斯方块告诉我们 太和群了 人就会消失 而不合群的话…...
有用建站宝盒做网站的吗/怎么给客户推广自己的产品
文章目录承接上文FileWriter类的使用写文件追加写入换行FileReader类的使用读文件文件复制学习资源推荐 https://blog.csdn.net/qq_42813491/article/details/90213353承接上文 这篇介绍的是java常见的io操作,偏字节流->https://blog.csdn.net/qq_42813491/art…...
什么网站免费可以做app/互联网营销方式
在实验课上第一次接触编程后,老师讲过我们学习编写C语言程序编写的环境是VC6.0,下来之后就在电脑浏览器上搜索了VC6.0, 。网页上有很多版本,最后选择了中文绿色网站版,下载安装包后,点击安装。 安装完成后&…...
搭建网站手机软件/企业管理咨询培训
当我们做大数据开发的时候,无论是MapReduce、hbase还是hdfs在本地调试都需要hadoop环境,没有这个环境就会报错: Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\b…...
如何做网站的banner/微商营销
interface map show cam arp cdp detail mac-address-table 在一个Cisco 交换网络中间,已知某台机器的IP地址,如何找出它连接到了哪台交换机的哪个端口上呢?最方便快捷的方法使使用CiscoWorks 2000 LMS网管软件的User tracking 功能&…...
想自己做微信网站的工作/刷关键词排名软件
概述 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库…...