MySQL必知必会:组合查询(Union)

article/2025/10/3 19:48:19

本篇文章主要介绍使用Union操作符将多个SELECT查询组合成一个结果集。本文参考《Mysql必知必会》+工作实践融合

组合查询

定义

在大多数开发中,使用一条SELECT查询就会返回一个结果集。如果,我们想一次性查询多条SQL语句,并将每一条SELECT查询的结果合并成一个结果集返回。就需要用到Union操作符,将多个SELECT语句组合起来,这种查询被称为并(Union)或者复合查询。

组合查询适用于下面两种情境中:

  1. 从多个表中查询出相似结构的数据,并且返回一个结果集

  2. 从单个表中多次SELECT查询,将结果合并成一个结果集返回。

演示

我们通过一个简单的示例来认识一下Union组合查询。

创建一个用户表

图片描述

首先分两次查询用户表,然后再组合查询

select user_id,user_nickname,user_status from yy_user where user_status = 1 // 第一次查询

图片描述

select user_id,user_nickname,user_status from yy_user where user_id > 3 // 第二次查询

图片描述

第一条SQL查询了user_status=1的用户,第二条查询了user_id > 3的用户

下面我们组合这两条SQL语句:

select user_id,user_nickname,user_status from yy_user where user_status = 1 
UNION
select user_id,user_nickname,user_status from yy_user where user_id > 3

图片描述

这条语句由前面的两条语句组成,通过Union组合了两条SELECT,并且把结果集合并后输出。这条组合查询也可以使用同等where语句来替代:

select user_id,user_nickname,user_status from yy_user where user_status = 1 or user_id > 3;

组合查询和Where

whereUnion在多数情况下都可以实现相同的结果集。where可以实现的语句一定可以使用Union语句来实现。但是反过来就不一定正确了,比如下面将会说到的去重和不去重。

另外,在单表中使用Unionwhere多条件查询较为复杂。而从多张表中获取数据,使用Union会相对于简单些。

Union使用规则

Union有他的强大之处,详细介绍之前,首先明确一下Union的使用注意规则。

  1. Union必须由两条或者两条以上的SELECT语句组成,语句之间使用Union链接。

  2. Union中的每个查询必须包含相同的列、表达式或者聚合函数,他们出现的顺序可以不一致(这里指查询字段相同,表不一定一样)

  3. 列的数据类型必须兼容,兼容的含义是必须是数据库可以隐含的转换他们的类型

包含重复、去除重复

我们观察一下上面两条语句,第一条SELECT返回了2条数据;第二条SELECT也返回了2条数据。

但是Union最终的结果返回了3条数据,而不是4条。mysql在查询结果集中帮我们自动去除了重复的行(重复的行是李四),把两条李四合并了。

一般情况下这样结果是好的,但是如果需要的情况下,我们可以使用Union All操作符来取消自动合并功能。

select user_id,user_nickname,user_status from yy_user where user_status = 1 
UNION ALL
select user_id,user_nickname,user_status from yy_user where user_id > 3

图片描述

这一次mysql没有帮我们去除重复,在查询结果中,我们也看到了两条重复的李四。

之前我们说过whereUnion的区别,这里Union All可以返回重复的数据,就是where子句完成不了的工作。

结果排序

使用Union组合查询时,只能使用一条order by子句对结果集进行排序,而且必须出现在最后一条出现的SELECT语句之后。因为`Union不允许对于部分结果集进行排序,只能针对最终检索出来的结果集进行排序。

注意:由于在多表组合查询时候,可能表字段并不相同。所以,在对于结果集排序的时候需要使用检索出来的共同字段。

(select user_id,user_nickname,user_status from yy_user where user_status = 1) 
UNION ALL
(select user_id,user_nickname,user_status from yy_user where user_id > 3)
order by user_id desc

上面检索的字段user_id必须存在于结果集中。

多表组合查询

大型项目中数据经常分布在不同的表,检索的时候需要组合查询出来。多表查询的时候,并不要求两个表完全相同,只需要你检索的字段结构相似就可以。

我们已经有一张user表,假设搜索时候我们需要将用户昵称和博客文章标题一同混合检索。

图片描述

看下上面的posts表,posts_nameuser_nickname类型相同,而posts_iduser_id类型相同,post_statususer_status类型相同。尽管他们的名称不相同。

我们可以这么来检索:

select posts_id,posts_name,posts_status from yy_posts
UNION
select user_id,user_nickname,user_status from yy_user

图片描述

从上面的检索结果能看出,我们将两个表的数据组合了起来。Union检索遇到不一致的字段名称时候,会使用第一条SELECT的查询字段名称,或者你使用别名来改变查询字段名称。

区分多表

上一个例子中,我们组合查询了user表和posts表。虽然结果混合在一起没有任何问题,但是当显示到页面的时候,我们需要给用户和文章不同的链接或者其他的区分。所以我们必须确定该条记录来自于哪张表,我们可以添加一个别名来作为表名。

select posts_id,posts_name,posts_status,'users' as table_name from yy_posts
UNION
select user_id,user_nickname,user_status,'posts' as table_name from yy_user

图片描述

注意SQL语句中的'users' as table_name。对应的是图片里的table_name,就是我们刚刚添加用于区别表的字段。

星空幻颖,严颖

个人主页:segmentfault

个人博客:地址 不过好久没有更新了,噗噗噗


http://chatgpt.dhexx.cn/article/afedT7xR.shtml

相关文章

组合查询——union

文章目录 1.组合查询2.创建组合查询2.1 使用union2.2 union规则2.3 包含或取消重复的行2.4 对组合查询结果排序 1.组合查询 组合查询指的是:在Mysql中执行多个查询,并将结果作为单个查询结果集返回。 这些组合查询通常称为并或复合查询。 以下2种情况&…

【SQL自学打卡|DAY13】——组合查询

前言 ❤欢迎大家阅读我的文章呀❤ 今天是SQL必知必会的最后一块练习。 希望你们在我的文章当中能有所收获!!! SLogan:利用有限的时间,撸起袖子加油干! 知识点回顾 内联结:inner join。取两列的交集。 外联…

PyCharm取消波浪线、下划线和中划线

默认情况下,PyCharm中如果有无法错误或者不符合PEP8规范代码下面会有波浪线,语法错误波浪线为红色(如下图的第10行),不符合PEP8规范为浅黄色波浪线(如下图的第8行),见下图&#xff1…

Python中下划线的含义及用法

看代码的时候,经常看到各种变量名带各种下划线,有单下划线、双下划线等,主要有五种下划线(按照下划线位置命名类型): 单下划线:_单下划线变量名:_var变量名单下划线:var…

Python 中下划线的 6 个作用

初学者看到 Python 中的下划线 _ 时可能会有些懵圈,不知道这个到底是干什么用的,今天就来盘点一下 Python 中的下划线有哪些用处。以后看到下划线时就可以对号入座了。 1、用在 Python 解释器,表示上一次的执行结果 即使不把 Python 用于编程…

html中的:下划线标签、中划线标签、斜体标记、粗体标记

<!-- 下划线标记 --><b>下划线标签&#xff1a;</b><u>u标签是下划线标签</u><br><!-- 中划线标签 --><b>中划线标题&#xff1a;</b><s>s是中划线标签</s><del>del也是中划线标签</del><br…

多种方法在Markdown加入上划线、中划线、下划线

上划线和下划线不是Markdown自身语法&#xff0c;因此需要一点摸索&#xff0c;特将结果记录于此 中划线 中划线是markdown自身语法&#xff0c;实现起来很简单&#xff1a; ~~中划线~~效果&#xff1a; 中划线 下划线 法一&#xff1a;借助Latex公式 $\underline{\text{…

UILabel,文字添加下划线,中划线

//显示下划线 //中划线 // NSDictionary *attribtDic {NSStrikethroughStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineStyleSingle]}; //下划线 NSDictionary *attribtDic {NSUnderlineStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineS…

CSS文本样式(中划线下划线行高之类的还有color也是)

1.颜色 2.对齐方式 3.首行缩进 4.行高 5.下划线&#xff08;装饰&#xff09; 6.文字跟图片对齐 1.颜色 颜色可以用 单词 表示也可以用 #RGB 表示 RGB代表的就是红绿蓝三种颜色 000000-FFFFFF 或者用 color&#xff1a;rgb&#xff08;0&#xff0…

为文字添加下划线和中划线

Android开发中如何给文字添加下划线和中划线呢&#xff0c;先看一下效果图&#xff1a; 下划线&#xff1a; 中划线&#xff1a; 方式一&#xff1a; //添加下划线 // textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//添加中划线textView.getPaint().setFl…

Python中下划线的5种含义

作者&#xff1a;地球的外星人君 链接&#xff1a;https://zhuanlan.zhihu.com/p/36173202 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 分享一篇文章&#xff1a;The Meaning of Underscores in Python。 本文介…

Python中的下划线到底什么意思?

1. 概述 在Python经常能见到含下划线&#xff08;underscore&#xff09;修饰的的变量和方法&#xff08;如__name__&#xff0c;_var等&#xff09;&#xff0c;这些下划线的作用称之为名字修饰&#xff08;name decoration&#xff09;。在Python中&#xff0c;名字修饰通常…

WPF中的文字修饰——上划线,中划线,基线与下划线

我们知道&#xff0c;文字的修饰包括&#xff1a;空心字、立体字、划线字、阴影字、加粗、倾斜等。这里只说划线字的修饰方式&#xff0c;按划线的位置&#xff0c;我们可将之分为&#xff1a;上划线、中划线、基线与下划线。如图&#xff1a; 从上至下&#xff0c;分别为上划线…

Java方法重载中返回值的问题

不能通过设置不同的返回值来实现方法重载&#xff0c;这样设置的方法不一定会编译通过&#xff0c;但Class文件中可以共存。 如下 1. 例证 IDEA工具,JDK8测试&#xff1a; 2. 原因 参考自《深入理解Java虚拟机》(第3版)&#xff0c;如图 在Java语言中&#xff0c;要重载&…

Java 方法重载简单小例子

简单讲&#xff0c;方法重载就是为了方便程序员记忆&#xff0c;比如你有say方法需要有好几个功能&#xff0c;写say1,say2又费事还弱智&#xff0c;就可以采用重载. package java03;public class demo1 {// 练习-------------------public int max(int number1, int number2)…

java 重载的特征_Java中方法的重载详解

一、方法的概念 在之前我们学习了方法的定义,方法实现指定功能的代码块的组合&#xff0c;基本的定义 如下: DEMO&#xff1a;定义一个方法 不需要return语句的方法 二、方法的重载 在开发中很可能在一个类中出现多个功能相似的方法&#xff0c;但是方法的命名要求是见名知意&a…

Java方法覆盖与方法重载

Ps&#xff1a;括号中的内容为自身理解&#xff0c;看到可以略过。本人喜欢想些乱七八糟的东西。 类继承&#xff1a;子类继承父类的状态和行为&#xff0c;同时也可以具有自己的特征。 &#xff08;简单来讲&#xff0c;就是基因&#xff08;非private&#xff09;继承&#…

什么叫java方法重载?

方法重载是指在一个类中定义多个同名的方法&#xff0c;但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时&#xff0c;Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同…

Java 方法重载习题答案

基础题目 第一题&#xff1a;语法练习 语法点&#xff1a;方法定义&#xff0c;方法重载 按步骤编写代码&#xff0c;效果如图所示&#xff1a; 编写步骤&#xff1a; 定义类 Test1,类中定义 main方法,定义int类型a为10, b为10.定义printNum方法,参数为(int iVar, int iVar…

java中方法重载

重载的三个要求&#xff1a;1.在同一个类中&#xff0c;2.同一个方法名&#xff08;不用在意返回值&#xff09;&#xff0c;3.不同的参数&#xff08;参数个数&#xff0c;参数类型&#xff09; 使用重载可以记住一个方法名&#xff0c;使用不同形参&#xff0c;完成不同类似的…