MySQL UNION 的用法与实例

在本文中,我们讨论在 MySQL 中对两个结果集进行 UNION 运算,以及 UNION 运算的规则。

在 MySQL 中,UNION 操作符是一个集合操作符,它用于合并 2 个结果集中的所有的行。

SQL 标准中定义了 3 个集合操作符: UNIONINTERSECT 和 MINUS。目前 MySQL 只支持 UNION

UNION 操作符语法

UNION 操作符用来合并两个 SELECT 语句的结果集。UNION 操作符的语法如下:

SELECT statement
UNION [DISTINCT | ALL]
SELECT statement

说明:

  • UNION 双目操作符,需要两个 SELECT 语句作为操作数。
  • UNION 中的 SELECT 语句中的列数、列顺序必须相同。
  • UNION 运算包括 UNION DISTINCT 和 UNION ALL 两种算法,其中 UNION DISTINCT 可以简写为 UNION
  • UNION DISTINCT 或 UNION 将过滤掉结果集中重复记录。
  • UNION ALL 将返回结果集中的所有记录。

UNION 实例

建立测试表和测试数据

在以下实例中,我们创建 a 和 b 两个表进行演示。

创建测试表并插入测试数据

CREATE TABLE a (v INT);
CREATE TABLE b (v INT);
CREATE TABLE c (v INT);INSERT INTO a VALUES (1), (2), (NULL), (NULL);
INSERT INTO b VALUES (2), (2), (NULL);
INSERT INTO c VALUES (3), (2);

a 表数据:

+------+
| v    |
+------+
|    1 |
|    2 |
| NULL |
| NULL |
+------+
4 rows in set (0.00 sec)

b 表数据:

+------+
| v    |
+------+
|    2 |
|    2 |
| NULL |
+------+
3 rows in set (0.00 sec)

c 表数据:

+------+
| v    |
+------+
|    3 |
|    2 |
+------+
2 rows in set (0.00 sec)

UNION 运算

以下语句对从 a 和 b 表返回的两个结果集进行 UNION 运算:

SELECT * FROM a
UNION
SELECT * FROM b;
+------+
| v    |
+------+
|    1 |
|    2 |
| NULL |
+------+
3 rows in set (0.00 sec)

从输出的结果可以看出,UNION 运算删除了结果集中的重复项,返回一个唯一记录值的结果集。

UNION 是 UNION DISTINCT 的简写。

除了对两个表的记录进行 UNION 运算,也可以对 ab 和 c 这 3 个表的记录进行 UNION 运算。如下:

SELECT * FROM a
UNION
SELECT * FROM b
UNION
SELECT * FROM c;
+------+
| v    |
+------+
|    1 |
|    2 |
| NULL |
|    3 |
+------+
4 rows in set (0.00 sec)

本例等同于如下的运算步骤:

  1. 首先对 a 和 b 表的记录进行 UNION 运算,并返回结果集。
  2. 将第 1 步的结果集和 c 表的记录进行 UNION 运算。

UNION ALL 运算

以下语句对从 a 和 b 表返回的两个结果集进行 UNION ALL 运算:

SELECT * FROM a
UNION ALL
SELECT * FROM b;
+------+
| v    |
+------+
|    1 |
|    2 |
| NULL |
| NULL |
|    2 |
|    2 |
| NULL |
+------+
7 rows in set (0.00 sec)

从输出的结果可以看出,UNION ALL 保留了两个结果集中的所有行。

除了对两个表的记录进行 UNION ALL 运算,也可以对 ab 和 c 这 3 个表的记录进行 UNION ALL 运算。如下:

SELECT * FROM a
UNION ALL
SELECT * FROM b
UNION ALL
SELECT * FROM c;

UNION 与 UNION ALL 组合运算

请看以下实例:

SELECT * FROM a
UNION
SELECT * FROM b
UNION ALL
SELECT * FROM c;
+------+
| v    |
+------+
|    1 |
|    2 |
| NULL |
|    3 |
|    2 |
+------+
5 rows in set (0.00 sec)

本例的运算步骤如下:

  1. 首先对 a 和 b 表的记录进行 UNION 运算,并返回结果集。这一步运算删除了 a 和 b 表的重复记录。
  2. 将第 1 步的结果集和 c 表的记录进行 UNION ALL 运算。这一步并没有删除 c 表中与第 1 部结果集中的重复记录。

UNION 排序

当需要对 UNION 运算的结果进行排序时,最需要在 SQL 语句的最后添加 ORDER BY 子句。

以下语句对从 a 和 b 表返回的两个结果集进行 UNION ALL 运算,并升序排序:

SELECT * FROM a
UNION ALL
SELECT * FROM b
ORDER BY v;
+------+
| v    |
+------+
| NULL |
| NULL |
| NULL |
|    1 |
|    2 |
|    2 |
|    2 |
|    3 |
+------+
8 rows in set (0.01 sec)

UNION 列数

当对两个结果集进行 UNION 运算的时候,要保证每个结果集具有相同的列数。否则就会产生错误。

请看如下的实例:

SELECT 1
UNION
SELECT 2, 3;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

这是因为 SELECT 1 只有 1 列,而 SELECT 2, 3 则有 2 列数据。两个结果集列数不一样,导致了 UNION 运算产生错误。

以下展示了两个结果集的列数。

SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
SELECT 2, 3;
+---+---+
| 2 | 3 |
+---+---+
| 2 | 3 |
+---+---+
1 row in set (0.00 sec)

本例也说明了, 参与 UNION 运算的结果集和字段的名称没有关系,只要列数一样就可以。

UNION 列名

参与 UNION 运算的结果集只要列数一样就可以。返回结果集的列名采用第一个结果集的列名。

我们先看参与 UNION 运算的两个结果集。

SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

此结果集只有一列,且列名为 1

SELECT 2;
+---+
| 2 |
+---+
| 2 |
+---+
1 row in set (0.00 sec)

此结果集只有一列,且列名为 2

我们再看 UNION 运算的实例:

SELECT 1 UNION SELECT 2;
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)

本例中,返回结果集中的列名使用了 SELECT 1 中的列名。

现在我们交换参与运算的两个结果集的顺序。请看下面的实例:

SELECT 2 UNION SELECT 1;
+---+
| 2 |
+---+
| 2 |
| 1 |
+---+
2 rows in set (0.00 sec)

本例中,返回结果集中的列名使用了 SELECT 2 中的列名。

那么,如果我们想自定义列名,只需要为第一个结果集的列设定一个别名即可。请看下面的实例:

SELECT 2 AS c
UNION
SELECT 1;
+---+
| c |
+---+
| 2 |
| 1 |
+---+
2 rows in set (0.00 sec)

结论

在本文中,我们讨论在 MySQL 中对两个结果集进行 UNION 运算,以及 UNION 运算的规则。以下是 UNION 运算的要点:

  • UNION 运算用于将两个结果集合成一个,是数据行维度的组合。
  • UNION 运算包括 UNION DISTINCT 和 UNION ALL 两种算法,其中 UNION DISTINCT 可以简写为 UNION
  • UNION 会删除两个结果集中的重复记录行,而 UNION ALL 则保留全部记录行。
  • UNION 运算要求参与运算的两个结果集的列数必须一样。
  • UNION 运算取第一个参与运算的结果集的列名作为最终的列名。
  • 可以使用 ORDER BY 对 UNION 运算的结果进行排序。

MySQL UNION 的用法与实例

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

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

相关文章

【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 沸羊羊舔狗自查表)

【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 & 沸羊羊舔狗自查表) 文章目录 1、情感关系中的平等意识2、如何经营一段长期稳定的关系(避免左倾 | 敬畏与担当)3、沸羊羊/舔狗自查表(避免右…

让css设置的更具有合理性

目录 一、合理性设置宽高 二、避免重叠情况,不要只设置最大宽 三、优先使用弹性布局特性 四、单词、数字换行处理 五、其他编码建议 平常写css时,除了遵循一些 顺序、简化、命名上的规范,让css具有合理性也是重要的一环。 最近的需求场…

Go小技巧易错点100例(二十一)

本篇内容: errors.Is方法与两种方式进行error比较 在Go语言中,处理错误(error 类型)时,errors.Is 和直接使用 操作符进行错误比较,虽然看起来都用于比较错误,但实际上它们有着根本的不同。这主…

【服务器项目部署】✈️将本地项目部署到服务器(二)!

目录 👋前言 👀一、功能调整 🌱二、服务部署 💞️三、代码调整 🍻四、章末 👋前言 小伙伴们大家好,上篇文章本地实践了如何将本地项目部署到服务器上,从服务器的选择、服务器环境…

Kafka消息队列

目录 前置内容常用脚本说明和示例描述与定义部分术语说明两种模式点对点模式发布订阅模式 topic主题命令行操作指令生产者Broker消费者 前置内容 队列: 先进先出 应用: 大数据中主要用于离线和实时处理 流程: Flume正常获取数据,…

如何使用 Ansys OptiSlang 同时运行多个参数化设计研究

了解如何通过使用 OptiSLang 同时运行多个参数化设计研究来提高工作效率。 了解参数化设计研究的重要性 参数化设计研究在工程和设计过程中起着至关重要的作用。通过改变输入参数,工程师可以探索不同设计选择的效果,并优化其设计以满足性能、成本或其他…

Nginx (40分钟学会,快速入门)

一、什么是Nginx ? 可以做什么 ? Nginx 是高性能的 HTTP 和反向代理的 web 服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达50000个并发的连接数.Nginx特点就是内存少,并发能力强。事实上…

【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 10.6.1. 生命周期标注语法 生命周期的标注并不会改变引用的生命周期长度。如果某个函数它制定了泛型生命周期参数,那么它就可…

【Android项目学习】3. MVVMHabit

项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础,整合OkhttpRxJavaRetrofitGlide等流行…

【大模型】7 天 AI 大模型学习

7 天 AI 大模型学习 Day 3 今天,我们要一起学习大模型微调了 ~ 包括:大模型微调领域概览、Lora微调 等 ~ 文章目录 7 天 AI 大模型学习 Day 3大模型微调概览大模型项目 pipeline提示词工程 Prompt EngineeringIn-context Learning…

密码学精简版

密码学是数学上的一个分支,同时也是计算机安全方向上很重要的基础原理,设置密码的目的是保证信息的机密性、完整性和不可抵赖性,安全方向上另外的功能——可用性则无法保证,可用性有两种方案保证,冗余和备份&#xff0…

DeepSeek-V3 正式发布,已在网页端和 API 全面上线,性能领先,速度飞跃。

DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中,DeepSeek-V3 在开源模型中位列榜首,与世界上最先进的闭源模型不分伯仲。 简介 DeepSeek-V3是一个强大的混合专家 (MoE) 语言模型,总共有 671B 个参数,…

图像超分辨新SOTA!南洋理工提出InvSR,利用大型预训练扩散模型图像先验来提高 SR 性能, 登上Huggingface热门项目。

南洋理工大学的研究者们提出了一种基于扩散反演的新型图像超分辨率 (SR) 技术,可以利用大型预训练扩散模型中蕴含的丰富图像先验来提高 SR 性能。 该方法的核心是一个深度噪声预测器,用于估计前向扩散过程的最佳噪声图。一旦训练完成,这个噪…

MySQL低版本没有函数row_number() over的解决方案

最近在维护老项目时,需要对历史数据做分析取出分区数据中的第一条,无奈因为MySQL版本过低,无法使用函数row_number() over,苍了个天~ 不过这点小事怎么可能难倒我们这群考古专家呢,在此分享一下解决方案。 主要原因是问…

贵州省贵安新区地图+全域数据arcgis格式shp数据矢量路网地名+卫星影像底图下载后内容测评

贵州省贵安新区地图全域数据arcgis格式shp数据矢量路网地名卫星影像底图 贵安新区地图是一款基于ArcGIS格式的地理信息系统数据集,包含2022年3月更新的详尽矢量路网、地名信息以及卫星影像底图。这款数据集是针对贵安新区这一特定区域设计的,对于规划、…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现

一、引言 从《音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介》中可以知道,PS流由一个个pack(包装)组成。一个pack 一个pack_header 一个或多个PES_packet。pack_header中还可能存在system header…

记一次k8s下容器启动失败,容器无日志问题排查

问题 背景 本地开发时&#xff0c;某应用增加logback-spring.xml配置文件&#xff0c;加入必要的依赖&#xff1a; <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>8…

【问题记录】npm create vue@latest报错

1&#xff0c;错误日志 npm error code EPERM npm error syscall mkdir npm error path D:\Program Files\nodejs\node_cache\_cacache npm error errno EPERM npm error FetchError: Invalid response body while trying to fetch https://registry.npmjs.org/create-vue: EP…

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML &#xff08;1&#xff09;XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   &#xff08;2&#xff09;XML 的设计宗旨是传输数据(目前主要是作为配置文件)&#xff0c;而不是显示数据。   &#xff08;3&a…