首页 > 数据库 >Mysql基础教程(14):UNION

Mysql基础教程(14):UNION

时间:2024-06-06 12:29:36浏览次数:56  
标签:+------+ 14 结果 UNION 基础教程 NULL SELECT 运算

MySQL UNION 的用法与实例

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

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

SQL 标准中定义了 3 个集合操作符: UNION, INTERSECT 和 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 运算,也可以对 a, b 和 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 运算,也可以对 a, b 和 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 运算产生错误

结论

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

⬅ Mysql基础教程(13):GROUP BY

➔ Mysql基础教程(15):别名

标签:+------+,14,结果,UNION,基础教程,NULL,SELECT,运算
From: https://blog.csdn.net/WwLK123/article/details/139408739

相关文章

  • 华为matebook 14s笔记本,Chrome浏览器开启硬件加速,屏幕闪屏,黑框,页面屏幕卡死,解决
    解决办法使用了https://zhuanlan.zhihu.com/p/644296061这个连接下的最后一个折中办法解决!一、现象Chrome开启“硬件加速模式”后,在观看视频时,尤其是全屏时,会出现短暂黑屏或黑块或闪屏。如果关闭“硬件加速”,则会造成播放某些高清视频(例如HEVC)视频或弹幕卡顿(似乎还好)。Edge......
  • SQL--union用法
    UNION 是SQL中用于合并两个或多个 SELECT 语句结果集的操作符。这些 SELECT 语句必须选择相同数量的列,并且这些列的数据类型必须兼容。UNION 会自动去除结果集中的重复行,而如果你想要保留重复行,可以使用 UNIONALL。 UNION 的基本语法:制代码SELECT column_na......
  • 实验14-使用cnn完成MNIST手写体识别
    实验14-1使用cnn完成MNIST手写体识别(tf).pyimporttensorflowastf#Tensorflow提供了一个类来处理MNIST数据fromtensorflow.examples.tutorials.mnistimportinput_dataimporttime#载入数据集mnist=input_data.read_data_sets('MNIST',one_hot=True)#设置批次......
  • CF1458A Row GCD
    题目链接:https://codeforces.com/problemset/problem/1458/A这道题比较考察对辗转相除法的理解.对于gcd的题目,gcd(a,b)=gcd(a,b-a)是一个很常见的trick,知道这个性质即可秒杀本题.gcd也可以像前缀和那样来维护还需要注意一个细节,由于a[i]-a[i-1]有可能出现负数,所以要先排序......
  • 题解:SP1442 CHAIN - Strange Food Chain
    双倍经验:P2024[NOI2001]食物链思路:一眼鉴定为并查集。观察题目发现有三种状态,考虑使用种类并查集(又称扩展域并查集)。既然有三种状态那么种类并查集自然也要开三倍。CODE:#include<bits/stdc++.h>usingnamespacestd;intfa[150010];intGet_Find(intx){//寻找父节点......
  • Android应用程序启动源码浅析-(三万字长文慎点&Android14)
    在Android桌面Launcher源码浅析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层的启动流程。一、启动流程sequenceDiagramparticipantUserparticipantLauncherparticipantActivityManagerService......
  • Day14 | 二叉树递归遍历
    递归遍历(必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的递归遍历.html注意前中后指的是根节点在前、中、后次序进行遍历。前序遍历#Definitionforabinarytreenode.#classTreeNode:#de......
  • 解决《鬼谷八荒》游戏启动问题:vcruntime140_1.dll错误的全面攻略
    在探索《鬼谷八荒》这一广受好评的修仙世界时,不少玩家可能会遇到一个恼人的障碍——“vcruntime140_1.dll无法继续执行代码”的错误提示。这个突如其来的技术难题无疑给原本期待沉浸于修仙之旅的玩家带来不小的困扰。不过,无需忧虑,本文将深入解析这一问题的根源,并提供一系列行之......
  • Ollama,在centos7宿主机上,curl http://宿主机IP:11434 提示拒绝访问 ,但是curl http://l
    Ollama,在centos7宿主机上,curlhttp://宿主机IP:11434提示拒绝访问,但是curlhttp://localhost:11434 正常 1.使用 netstat 或 ss 命令在宿主机上检查 11434 端口的状态[root@localhost~]#netstat-tulnp|grep11434tcp00127.0.0.1:11434......
  • 14-ShardingSphere的分布式主键实现
    1ShardingSphere自动生成键MySQL自增键、Oracle自增序列等。分片场景下问题就复杂了,不能依靠单实例上的自增键来实现不同数据节点之间的全局唯一主键,分布式主键的需求应运而生。ShardingSphere作为一款优秀分库分表开源软件,同样提供分布式主键实现机制。1.1GeneratedKey使用......