数据库中的union与union all的区别
Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All
两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
可以在最后一个结果集中指定Order by子句改变排序方式。
例如:
select employee_id,job_id from employees
union
select employee_id,job_id from job_history
以上将两个表的结果联合在一起。这两个例子会将两个select语句的结果中的重复值进行压缩,也就是结果的数据并不是两条结果的条数的和。如果希望即使重复的结果显示出来可以使用union all,例如:
2.在oracle的scott用户中有表emp
select * from emp where deptno >= 20
union all
select * from emp where deptno <= 30
这里的结果就有很多重复值了。
有关union和union all关键字需要注意的问题是:
union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来。
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名。例如下面是一个例子:
select empno,ename from emp
union
select deptno,dname from dept
我们没有必要在每一个select结果集中使用order by子句来进行排序,我们可以在最后使用一条order by来对整个结果进行排序。例如:
select empno,ename from emp
union
select deptno,dname from dept
order by ename;
------------------------------------------------------------
UNION 并集,表中的所有数据,并且去除重复数据(工作中主要用到的是这个);
UNION ALL,表中的数据都罗列出来;
那么交集怎么取呢,怎么取得几张表中的重叠的部分呢?(文末提供了一种方法)
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。需要满足以下条件:
1、相同数量的列;
2、列也必须拥有相似的数据类型;
3、同时,每条 SELECT 语句中的列的顺序必须相同。
这三点一定要牢记,下面用一个小例子来说明。
建了两张表,一张选功夫课程的学生表,一张是选音乐课程的学生表。里面的主要数据如下
我们先用UNION连接一下,查看下查询结果。
仔细看一下,不是说UNION是并集且去掉重复的数据吗。为什么还会有两个令狐冲?
这样来看为什么只有一个令狐冲呢,再对比一下脚本,原来是第一个脚本的字段比第二个脚本的查询到的字段比较多。观察第一个脚本的查询结果并没有四列全部重复的数据,所以查询时要尽量明确自己的目的。如果是查询学习课程的同学有哪些,第二个脚本的查询结果就是。而第一个脚本就是查询了哪些同学选了哪些课程,并且任课老师的信息全部列出来了。
接下来来看交集怎么取,查询目的,有哪些同学既学习了武功还学习了音乐。
union在数据库运算中会过滤掉重复数据,并且合并之后的是根据行合并的,即:如果a表和b表中的数据各有五行,且有两行是重复数据,合并之后为8行。运用场景:适合于需要进行统计的运算
union all是进行全部合并运算的,即:如果a表和b表中的数据各有五行,且有两行是重复数据,合并之后为10行。
join是进行表关联运算的,两个表要有一定的关系。即:如果a表和b表中的数据各有五行,且有两行是重复数据,根据某一列值进行笛卡尔运算和条件过滤,假如a表有2列,b表有2列,join之后是4列。
对于无关的运算,一般适合于full join,这样在图表展示的时候可以进行很好的处理,每个元素都可以展示的很好。
union在进行表求并集后会去掉重复的元素,所以会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
union all则只是简单地将两个结果集合并后就返回结果。因此,如果返回的两个结果集中有重复的数据,那么返回的结果就会包含重复的数据。
从上面的对比可以看出,在执行查询操作时,union all要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据,那么最好使用union all。例如,现有两个学生表Table1和Table2:

执行语句:
select * from Table1 union select * from Table2
查询结果如下:

执行语句:
select * from Table1 union all select * from Table2
查询结果如下:

数据库中的union与union all的区别的更多相关文章
- 数据库中drop、delete与truncate的区别
数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...
- 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别
.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...
- mysql 数据库中 int(3) 和 int(11) 有区别么???
今天去面试的时候 面试官问到了这个问题:int(3) 和 int(11) 有什么区别?? 当时一听有点蒙,(不知道为什么蒙,后来回来想想可能是觉得考官怎么会问这么简单的问题呢,所以蒙了),当时我的回答 ...
- Oracle数据库中truncate命令和delete命令的区别
首先讲一下,truncate命令: 语法:TRUNCATE TABLE table; 表格里的数据被清空,存储空间被释放. 运行后会自动提交,包括之前其它未提交的会话,因而一旦清空无法回退. 只有 ...
- 数据库中row_number()、rank()、dense_rank() 的区别
row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号. ...
- 数据库中的gt,ge,lt,le的区别
eq相等 ne.neq不相等, gt大于, lt小于 gte.ge大于等于 lte.le 小于等于 not非 mod求模 is [not] div by是否能被某数整除 i ...
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...
- Oracle中Union与Union All的区别(适用多个数据库)
Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...
- ORA-01790 错误处理 SQL同一数据库中,两个查询结果数据类型不同时的union all 合
转自: 出现这种错误,要先看一下是不是sql中有用到连接:union,unio all之类的,如果有,需要注意相同名称字段的数据类型一定要相同. 所以在union 或者union all 的时候造成了 ...
随机推荐
- 微信小程序中使用云开发获取openid
微信小程序获取openid 新建一个微信小程序项目 注意要注册一个自己的小程序账号,并有属于自己的appid 点击云开发按钮,自行填入开发环境名称 打开app.js,找到依赖环境 修改为刚才设置的环境 ...
- 191010 python3分解质因数
# 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5.# 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:# (1)如果这个质数恰等于n,则说明分解 ...
- helm笔记
一.注意事项 1.values.yaml 中可以使用'#'号注释行,而/templates 下的文件不能用#号,如果要注释可以使用 {{/* context */}} 2.{{- #忽略 ...
- zabbix Server 4.0 监控TCP的12种状态
zabbix Server 4.0 监控TCP的12种状态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大家对TCP三次握手比较熟悉了,都知道当发生DOSS攻击时,客户端发送 ...
- idou老师教你学istio 31:Istio-proxy的report流程
Istio-proxy的report主要是将envoy采集到的连接attributes的信息上报给控制面的mixer,它的入口在request_handler_impl.cc文件中,这里需要打开ena ...
- Codes: MODERN ROBOTICS Ch.3_Expo. Coods.基础代码实现
%%1 Transform omega to so3 matrix % W for skew-symmetirc matirx % w for omega, angular velocity func ...
- 基于Java+Selenium的WebUI自动化测试框架(十二)-----读取Excel文件(POI)(2)
上一篇我们讲了怎么利用Java的反射机制,将Excel的读取到的数据,赋值给我们构造函数中定义的变量. 接下来就简单了,我们将实际实现这个读取的简单过程.来看下面一段代码. private stati ...
- 《你说对就队》第八次团队作业:Alpha冲刺 第四天
<你说对就队>第八次团队作业:Alpha冲刺 第四天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...
- LINQ查询表达式(4) - LINQ Join联接
内部联接 按照关系数据库的说法,“内部联接”产生一个结果集,对于该结果集内第一个集合中的每个元素,只要在第二个集合中存在一个匹配元素,该元素就会出现一次. 如果第一个集合中的某个元素没有匹配元素,则它 ...
- 七.Protobuf3 嵌套类型
Protobuf3 嵌套类型 您可以在其他消息类型中定义和使用消息类型,如下例所示:这里Result消息是在SearchResponse消息中定义的: message SearchResponse { ...