mysql 两个查询结果合并去重_《MySQL 入门教程》第 21 篇 集合操作符

文章来源:https://blog.csdn.net/horses/article/details/108174837

来源平台:CSDN

原文作者:不剪发的Tony老师

数据表与集合理论中的集合非常类似,表是由行组成的集合。SQL 标准定义了基于行的各种集合操作:并集运算(UNION)、交集运算(INTERSECT)和差集运算(EXCEPT)。

  1. UNION,用于将两个查询结果合并成一个结果集,返回第一个查询或者第二个查询中的数据;
  2. INTERSECT,用于返回两个查询结果中的共同部分,即同时属于第一个查询结果和第二个查询结果的数据;
  3. EXCEPT,用于返回出现在第一个查询结果中,但不在第二个查询结果中的数据。

这些操作符都可以将两个查询的结果集合并成一个结果集,但是合并的规则各不相同,如下图所示:

a2cb3726745745c70dd8771bf502c32a.png

对于集合操作符,参与运算的两个查询结果需要满足以下条件:

  • 结果集中字段的数量和顺序必须相同;
  • 结果集中对应字段的类型必须匹配或兼容。

也就是说,两个查询结果的字段结构必须相同。如果一个查询返回 2 个字段,另一个查询返回 3 个字段,肯定无法合并。如果一个查询返回数字类型的字段,另一个查询返回字符类型的字段,通常也无法合并;不过 MySQL 可能会执行隐式的类型转换。

21.1 并集(UNION)

UNION 操作符用于将两个查询结果合并成一个结果集,返回第一个查询或者第二个查询中的数据:

SELECT column1, column2, ...  FROM table1  UNION [DISTINCT | ALL]SELECT col1, col2, ...  FROM table2;

其中,DISTINCT 表示将合并后的结果集进行去重;ALL 表示保留结果集中的重复记录;如果省略,默认为 DISTINCT。例如:

CREATE TABLE t1(id int);INSERT INTO t1 VALUES (1), (2);CREATE TABLE t2(id int);INSERT INTO t2 VALUES (1), (3);SELECT id AS n FROM t1 UNION SELECT id AS m FROM t2;n|-|1|2|3|SELECT id AS n FROM t1 UNION ALLSELECT id AS m FROM t2;n|-|1|2|1|3|

第一个查询结果中只返回了一个数字 1;第二个查询结果中保留了重复的数字 1。另外,UNION 操作返回的字段名由第一个 SELECT 语句决定。

以下语句由于两个 SELECT 返回的字段数量不同而产生错误:

SELECT 1  AS n, 'a' AS sUNION ALLSELECT 1 AS m;ERROR 1222 (21000): The used SELECT statements have a different number of columns

以下语句通过隐式类型转换返回了合并之后的结果:

SELECT 1 AS n, 'a' AS sUNION ALLSELECT 1, 2;n|s|-|-|1|a|1|2|

返回结果中的第二个字段类型为字符串。

对于多个表的 UNION 操作,按照从前到后的自然顺序执行。例如:

SELECT 1 AS nUNION ALLSELECT 1UNION SELECT 1;n|-|1|

由于第二个 UNION 操作没有 ALL 选项,最终返回了去重之后的结果,也就是一个 1。

21.1.1 ORDER BY 和 LIMIT

如果要对整个 UNION 操作的结果进行排序和数量限定,可以将 ORDER BY 和 LIMIT 子句加到语句的最后。例如:

SELECT id AS n FROM t1UNION ALLSELECT id AS m FROM t2ORDER BY n;n|-|1|1|2|3|

如果要对参与 UNION 的 SELECT 语句进行排序和数量限定,需要使用括号包含。例如:

(SELECT id AS n FROM t1 ORDER BY id DESC LIMIT 1)UNION ALL(SELECT id AS m FROM t2  ORDER BY id LIMIT 1);n|-|2|1|

这种排序操作不会影响到最终的结果顺序,如果要对最终结果进行排序,还需要在查询语句的最后再加上一个 ORDER BY 子句。

21.2 交集(INTERSECT)

MySQL 没有实现 SQL 标准中的 INTERSECT 操作符。按照定义,它可以返回两个查询结果中的共同部分,即同时出现在第一个查询结果和第二个查询结果中的数据:

SELECT DISTINCT table1.column1, table1.column2, ...  FROM table1   JOIN table2     ON (table1.column1 = table2.col1 AND table1.column2 = table2.col2 ...);

虽然 MySQL 不支持以上语法,但是我们可以通过 JOIN 查询实现相同的结果。

SELECT DISTINCT table1.column1, table1.column2, ...  FROM table1   JOIN table2     ON (table1.column1 = table2.col1 AND table1.column2 = table2.col2 ...);

其中,DISTINCT 用于去除查询结果中的重复记录,实现和 INTERSECT 相同的效果。例如:

SELECT DISTINCT t1.idFROM t1JOIN t2 ON (t1.id = t2.id);id|--| 1|

以上查询返回了 t1 和 t2 的交集。

还有一种方法也可以实现相同的结果,就是使用 IN 或者 EXISTS 子查询语句。例如:

SELECT DISTINCT idFROM t1WHERE id IN (SELECT id FROM t2);id|--| 1|

21.3 差集(EXCEPT)

MySQL 没有实现 SQL 标准中的 EXCEPT 操作符。按照定义,它可以返回出现在第一个查询结果中,但不在第二个查询结果中的数据:

SELECT column1, column2, ...  FROM table1 EXCEPTSELECT col1, col2, ...  FROM table2;

虽然 MySQL 不支持以上语法,但是我们同样可以通过 JOIN 查询实现相同的结果。

SELECT column1, column2, ...  FROM table1   LEFT JOIN table2    ON (table1.column1 = table2.col1 AND table1.column2 = table2.col2 ...) WHERE table2.col1 IS NULL;

左外连接返回了 table1 中的所有数据,WHERE 条件排除了其中属于 table2 的数据,从而实现了 EXCEPT 操作符的效果。例如:

SELECT t1.idFROM t1 LEFT JOIN t2 ON (t2.id = t1.id)WHERE t2.id IS NULL;id|--| 2|

还有一种方法也可以实现相同的结果,就是使用 NOT IN 或者 NOT EXISTS 子查询语句。例如:

SELECT DISTINCT idFROM t1WHERE id NOT IN (SELECT id FROM t2);id|--| 2|

对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,可以关注并私信我:01。获取。我这里有最新的Java基础全套视频教程。

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

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

相关文章

binutils工具集之---ar

1.如果要将多个.o文件生成一个库文件,则存在两种类型的库,一种是静态库,在linux里面后缀是.a,另一种是动态库,后缀为.so。 当可执行程序要与静态库进行链接时,所用到的库中的函数和数据会被拷贝到最终的可执…

jax-rs jax-ws_Google App Engine JAX-RS REST服务

jax-rs jax-ws在本文中,您将学习如何使用JAX-RS参考实现(Jersey)创建REST服务并将其部署在Google AppEngine上。 先决条件 对于本教程,您将需要: 一个Google AppEngine帐户 Eclipse Galileo(3.5.x&#xf…

[转]使用C#开发ActiveX控件

前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C或VB语言开发,本文介绍另一…

用Java测试多线程代码

测试多线程代码是一个艰巨的挑战。 尝试测试并发性时获得的第一个建议是尽可能地在代码中隔离并发问题。 这是一般的设计建议,但在这种情况下甚至更重要。 确保首先正确地对并发构造所包装的逻辑进行单元测试。 否则,您可能会花费很长时间尝试找出一个并…

php pdo mysql query_PHP+MYSQL中使用PDO的query方法

一 代码class"php">PDO连接MySQL数据库IDPDO数据库时间$dbmsmysql; //数据库类型 ,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数$hostlocalhost; //数据库主机名$dbNamedb_database15; //使用的数据库$use…

java 冒号 正则表达式_Java正则表达式问号冒号的使用

在Java和Javascript中正则表达式字符串前面加上?:表示非捕获型匹配,否则就是捕获型匹配。捕获型括号会将匹配到的内容捕获到一些变量里,这些变量按照捕获型括号的左括号为顺序从1开始编号。为了避免括号太多使编号混乱,也为了避免无用的捕获…

Hibernate中的一对多XML映射

一对多关系指出一个实体的单个实例与另一个实体的多个实例相关联。 换句话说,一个表中的每个记录与另一个表中的多个记录相关联。 让我们看看如何通过XML映射文件在Hibernate中定义这种关系。 1.实体关系图 假设我们已经在数据库中创建了学生表和部门表&#xff0…

camel eip_Apache Camel教程– EIP,路由,组件,测试和其他概念的简介

camel eip公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术,协议和数据格式。 但是,这些应用程序的集成应以标准化的方式建模,有效实现并由自动测试支持。 企业集成模式(EIP)…

JavaOne和OOW 2015总结

大家好! 终于,我回来了一个很棒的JavaOne和OOW2015。在这篇文章中,我想分享我的经验,一些照片和我参加的演讲的摘要。 会议前 我于2015年6月24日星期六乘Copa航空公司CLO-PTY-SFO飞往旧金山。 从哥伦比亚出发(大约8小…

Marin说PCB之 PCB封装和原理图封装的藕断丝连--续集(2)

最近天气越来越冷了,小编我在上海漂泊的十多年了,感觉今年似乎是最冷的一年啊。家里的秋裤都不管用了,要换成大棉裤和军大衣啊。而且现在羽绒服大部分都很贵,动不动上千元了,都赶得上小编我几个月的私房钱了都&#xf…

调整线程池的重要性

无论您是否知道,您的Java Web应用程序很可能都使用线程池来处理传入的请求。 这是许多人忽略的实现细节,但是迟早您需要了解如何使用该池以及如何为您的应用程序正确调整池。 本文旨在说明线程模型,什么是线程池以及正确配置线程池所需执行的…

在线原理图绘制网站推荐

如今专业EDA软件已经基本在硬件公司普及并正版化,优秀的EDA工具包括 Cadence公司的OrCAD、Allegro软件,Mentor Graphics的PADS, Altium公司的Altium Designer等等,但是它们在功能异常强大的同时也在一些时候显得非常复杂&#xff…

java map与set的区别_java 集合(list,set,map)三者之间的关系和区别

原java 集合(list,set,map)三者之间的关系和区别一:先上一张关系图,让大家看的更明白。备注:其中红色部分为实现,其他地方均为接口。二:各自的特点。List 有序,可重复ArrayList优点: 底层数据结…

adf时间作用域_ADF任务流:页面片段的托管bean作用域

adf时间作用域介绍 当我们使用ADF任务流并需要实现一些特定于流的业务逻辑或存储一些与流相关的信息时,我们通常使用pageFlowScope托管bean。 而且,当我们需要为流的活动(页面或页面片段)提供服务时,我们会为此类托管b…

IMA文件如何打开,winimage使用方

一般先用UltraISO打开一个系统的镜像文件(.iso)。其中有些文件(尤其是.ima,img)比如下面雨林木风Ghost系统盘的这个IMA文件,我们先提取到桌面 用WinImage打开这个文件即可发现这个IMA文件整合了很多东西。所以&#x…

Java的几何布朗运动

Wiener过程是连续时间随机过程,以纪念Norbert Wiener命名。 通常用于用随机成分表示噪音或财务状况。 可以计算几何布朗运动以可视化某些界限(以分位数表示)以暗示绝对范围。 为了进行计算,需要以下参数: &#xff0…

mongodb java id 查询数据_java 用 _id 查找 MongoDB 下的数据

找网上的资料看了下增删改查,等日后补上。已经实现了数据的插入,现在想通过 _id属性来查找数据。一开始看到 类似 55b321df715cc162076eb466 这么一长串的内容觉得是string类型。但是发现并不能搜索到结果,在网上搜到了解决方案:S…

java maven部署_eclipse中maven项目部署到tomcat

下面就一一介绍这几种部署方式:1.打war包到tomcat/webapps目录这种方式其实跟非maven项目没什么区别,就是打包的方式不同之后在target目录下会生成war包,复制到tomcat/webapps目录即完成部署。2.使用tomcat-maven插件,在pom.xml的…

word 论文排版 —— 按指定格式章节的自动编号

在word中如何实现章节标题自动编号 标题样式与标题的编号是两个步骤,为标题建立编号是在为标题样式确定的基础后进行的。这是显而易见的,也即只有先定义了多级标题(也可使用 word 自带的标题样式),才可为这些多级标题自…

北斗有 35 颗卫星,而 GPS 有 24 颗卫星,为什么二者数量不同?

作者:知乎用户链接:https://www.zhihu.com/question/21092045/answer/17164418来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。反对目前的两个不靠谱回答!需要的卫星数目和别人占坑没有…