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…

mysql锁与性能_MySQL性能优化--锁(概念)

《 MySQL性能优化--锁》首发牧码人博客转发请加此提示MySQL基本概念--锁介绍下对于MySQL锁机制的理解从基本概念开始:共享锁共享锁的代号是S,是Share的缩写,共享锁的锁粒度是行或者元组(多个行)…

[转]使用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…

pat 团体赛练习题集 L2-008. 最长对称子串

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。 输入格式: 输入在一行中给出长度不超过1000的…

在Apache Camel中使用Spring数据

Spring Data通过创建智能的DAO节省了很多时间,您基本上不需要编写任何代码就可以免费获得DAO。 它基本上遵循Eric Evans的DDD书中的“ 存储库模式 ” ,并将实体视为集合。 它有一个很好的约定,允许您为复杂查询指定条件,甚至可以将…

python协程池操作mysql_python_协程方式操作数据库

#!/usr/bin/python3# -*- coding: utf-8 -*-import requestsimport geventimport pymysqlfrom gevent import monkey# 堵塞标记monkey.patch_all()class SqlSave(object):"""协程方式写入数据库"""def __init__(self):SQL_DBA {‘host‘: ‘loc…

bootstrap在ie8下,兼容媒体查询

最近使用bootstrap做网站的时候发现&#xff0c;在ie8下的媒体查询一直失效&#xff1a; 后来解决了&#xff0c;做如下记录&#xff1a; 1、必须运行在服务器下 2、hack 条件语法&#xff0c;如下&#xff1a; <!--[if lte ie 9]><script src"js/html5shiv.min.…

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

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

Hibernate中的一对多XML映射

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

java resize_OpenCV3 Java图像放大缩小 修改图像大小(Imgproc.resize)

Imgproc.resize()方法参数&#xff1a;src&#xff1a;输入&#xff0c;原图像&#xff0c;即待改变大小的图像&#xff1b;dst&#xff1a;输出&#xff0c;改变大小之后的图像&#xff0c;这个图像和原图像具有相同的内容&#xff0c;只是大小和原图像不一样而已&#xff1b;…

mongodb中Gson和java##Bean对象转化类

此类使用感觉比较繁琐, 每个字段加注解才可以使用, 不如mongoTemplate使用方便, 但如果使用mongo客户端的话, 还是比手动拼接快一点, 所以贴在这儿 package com.iwhere.util;import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java…

java中sql查询语句_JAVA中用 SQL语句操作小结

1、添加记录(INSERT)使用SQL语句的INSERT命令可以向数据库中插入记录&#xff0c;INSERT命令的基本形式为&#xff1a;INSERT INTO 表名 [(字段名1,字段名2…)] VALUES (值1,值2,…)若在输入记录时&#xff0c;每个字段均有内容&#xff0c;可省略表名后的字段名。该SQL语句用于…

专题:二分图匹配

挖坑转载于:https://www.cnblogs.com/bestwzh/p/6487477.html

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

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

java map 不存在的key_java – HashMap表示即使它确实存在,Key也不存在

我遇到了一个有趣的问题,我很确定是HashMap的错.考虑以下调试代码(AMap是HashMap,key是传递给此方法的值)System.out.println("getBValues - Given: " key);System.out.println("getBValues - Contains Key: " AMap.containsKey(key));System.out.printl…

XML 解析器

XML Parser 所有现代浏览器都有内建的 XML 解析器。 XML 解析器把 XML 文档转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象。 解析 XML 文档 下面的代码片段把 XML 文档解析到 XML DOM 对象中&#xff1a; if (window.XMLHttpRequest){// code for IE7, Firefox, Chrome,…

JavaOne和OOW 2015总结

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