转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值,即UNION是去了重的。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
UNION指令的目的是将两个 SQL语句的结果合并起来。从这个角度来看,
UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。union只是将两个结果联结起来一起显示,并不是联结两个表…………
UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2] 假设我们有以下的两个表格,
Store_Information 表格
|
|||||||||||||||
Internet Sales 表格
|
而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句: SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales 结果:
Date |
Jan-05-1999 |
Jan-07-1999 |
Jan-08-1999 |
Jan-10-1999 |
Jan-11-1999 |
Jan-12-1999 |
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。
SQL Union All
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和UNION 不同之处在于
UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。UNION ALL 的语法如下:
[SQL 语句1]
UNION ALL
[SQL 语句 2] 我们用和上一页同样的例子来显示出UNION ALL 和 UNION 的不同。同样假设我们有以下两个表格,
Store_Information 表格
|
|||||||||||||||
Internet Sales 表格
|
而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的 SQL 语句: SELECT Date FROMStore_Information
UNION ALL
SELECT Date FROM Internet_Sales 结果:
Date |
Jan-05-1999 |
Jan-07-1999 |
Jan-08-1999 |
Jan-08-1999 |
Jan-07-1999 |
Jan-10-1999 |
Jan-11-1999 |
Jan-12-1999 |
另见:
====================================================================================================================================
sql union all的执行效率要比sql union效率要高很多
在数据库中,union和union all 关键字都是将两个结果集合合并为一个,但这两者从使用和效率上来说都有所不同。
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:
select * from gc_dfys
union
select * from ls_jg_dfys
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:
select * from gc_dfys
union all
select * from ls_jg_dfys
注释:
1、值得注意的是,sql union all的执行效率要比sql union效率要高很多,这是因为,使用sql
union需要进行排重,而sql union All
是不需要排重的,这一点非常重要,因为对于一些单纯地使用分表来提高效率的查询,完全可以使用sql union All。
还有,如果使用了union,无论是sql union还是sql union all一定要记住对数据库表加上索引!
2、UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
也就是说,筛选掉重复的记录的过程就是对在表链接后会对所产生的结果集先进行排序运算(order by 表上所有的列),之后根据表的下一行是否与上一行相同来判断下一行是否是重复行而将其删除。
参考:
http://blog.163.com/fly_sky_java/blog/static/14042223420106895310701/
百度 union all用法
==================================================================================================================================
union all和order by一起使用出问题
select * from (select * from (select zxbz,count(*)rs from dc_jhmy where 1=1 group by zxbz order by rs desc
union all
select 'hj' as zxbz,count(*)rs from dc_jhmy where 1=1)where rownum <= 100
SQL语句如上,我想实现除最后的union all 之前所有的记录先排序,然后在加上最后一条记录,可是 order by rs desc
放在现在的位置报错,命令未正确结束。
解决方法如下:利用临时表
select * from (select * from (select zxbz,count(*)rs from dc_jhmy where 1=1 group by zxbz order by rs desc)
union all
select 'hj' as zxbz,count(*)rs from dc_jhmy where 1=1)where rownum <= 100
参考:
http://blog.sina.com.cn/s/blog_6cb0deff0100t4l8.html
百度 union all order by
====================================================================================================================================
- union all和group by的顺序问题
- 2013-08-27 13:13:28 我来说两句 来源:Sarah Cla的专栏
-
union all和group by的顺序问题通过三个实验,来看 union all 及 group by 不同的使用顺序对CPU时间及耗时的影响1. 先Union All, 再Group By1234567891011
select
inctmid ctmid,cnlid,inwhsid whsid,sum
(qty) qty,goodsid
from
(
select
inctmid,cnlid,inwhsid,qty,goodsid
from
DtrBill a,DtrDetail b
where
a.billno=b.billno
union
all
select
inctmid,cnlid,inwhsid,-1*qty qty,goodsid
from
DtrBillRet a,DtrDetailRet b
where
a.billno=b.billno
)a
group
byinctmid,cnlid,inwhsid,goodsid
2. 分别Group By,再Union All,再Group By12345678910111213select
inctmid ctmid,cnlid,inwhsid whsid,sum
(qty) qty,goodsid
from
(
select
inctmid,cnlid,inwhsid,
sum
(qty) qty,goodsid
from
DtrBill a,DtrDetail b
where
a.billno=b.billno
group
by
inctmid,cnlid,inwhsid,goodsid
union
all
select
inctmid,cnlid,inwhsid,
sum
(-1*qty) qty,goodsid
from
DtrBillRet a,DtrDetailRet b
where
a.billno=b.billno
group
by
inctmid,cnlid,inwhsid,goodsid
)a
group
byinctmid,cnlid,inwhsid,goodsid
3. 先Group By,再Union123456789select
inctmid,cnlid,inwhsid,sum
(qty) qty,goodsid
from
DtrBill a,DtrDetail bwhere
a.billno=b.billnogroup
byinctmid,cnlid,inwhsid,goodsid
union
select
inctmid,cnlid,inwhsid,sum
(-1*qty) qty,goodsid
from
DtrBillRet a,DtrDetailRet bwhere
a.billno=b.billnogroup
byinctmid,cnlid,inwhsid,goodsid
4. 执行计划上的不同: 实验 2,3 多了两个分支上的Hash匹配操作5. 实验结果及结论方式CPU时间占用时间结论12275362并行度高,但最耗CPU资源21622416并行度中等,最节省CPU资源(貌似是折中的选择)31811507并行度最低,消耗CPU资源中等
参考:
百度 union all group by
转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题的更多相关文章
- 列转行pivot函数在SQL Sever里面和Oracle里面的用法区别
首先pivot是一个列转行的函数,反向用是unpivot(行转列). 在SQL sever中可以这么写 SELECT * FROM [TABLE] /*数据源*/ AS A PIVOT ( MAX/* ...
- sql union和union all的用法及效率
UNION指令的目的是将两个SQL语句的结果合并起来.从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料. UNION的一个限制是两个 ...
- sql语句or与union all的执行效率比较
看到一篇文章是讲sql语句or与union all的执行效率比较的,以前没怎么注意这个问题,感觉文章写的不错,转来一看. 文章原链接:http://www.cunyoulu.com/zhuanti/q ...
- SQL Union和SQL Union All用法
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...
- linux之SQL语句简明教程---UNION ALL
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起. UNION ALL 和UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复 ...
- SQL 语句中的union操作符
前端时间,用到了union操作符,周末有时间总结下,w3c手册内容如下: SQL UNION操作符 UNION操作符用于合并两个或多个select语句的结果集. 注意:UNION内部select语句必 ...
- (转)sql union和union all的用法及效率
1 熟悉union的相关操作 UNION指令的目的是将两个SQL语句的结果合并起来.从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料 ...
- Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解
UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号='180101' ...
- Sql语句之并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)
UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号='180101' ...
随机推荐
- Calling / Running a report in Oracle forms 10g / 11g
Calling / Running a report in Oracle forms 10g / 11g Below is the procedure to call a report in Orac ...
- 历史命令history
历史命令在用户注销之后会保存在用户家目录下的-/.bash_history中 history #查看系统中实时缓存的历史命令,与.bash_history中的内容并不完全相同 history -c # ...
- 《Redis设计与实现》读书笔记
<Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...
- git学习笔记09-bug分支-自己的分支改到一半了-要去改bug怎么办?
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交: 并不是你不想提交,而是工作只进行到一半,还没法 ...
- 教你如何拔取百度地图POI兴趣点
教你如何拔取百度地图POI兴趣点 通过聚合数据提供的接口,获取百度地图的POI兴趣点,并存储至数据库中. 实现: 1.聚合数据百度POI接口说明 调用聚合数据,首先得注册聚合.聚合数据提供的百度地 ...
- ubuntu_常用命令_01
1. 获取超级用户权限(需要输入超级用户的密码) sudo -i 2. 文本编辑器(暂时觉得 类似Windows里面的txt,更多功能有待发现) gedit /xxx/yyy ZC: 貌似 这个命令 ...
- placeholder在不同浏览器下的表现及兼容方法(转)
1.什么是placeholder? placeholder是html5新增的一个属性,当input或者textarea设置了该属性后,该值的内容将作为灰字提示显示在文本框中,当文本框获得焦点(或 ...
- poj1673EXOCENTER OF A TRIANGLE
链接 据说这题是垂心..数学太弱没有看出来,写了分朴实无华的代码.. 旋转三边得到图中的外顶点,然后连接三角形顶点求交点,交上WA..觉得没什么错误就去看了下discuss,发现都在说精度问题,果断开 ...
- Java 13 字符串
1 String对象不可变 每一个修改String值的方法 实际上都是创建一个全新的String对象 public class Immutable { public static String upc ...
- iOS——为Xcode编译POCO C++静态库
一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...