文档章节

MySQL中UNION和UNION ALL的使用

IT_小翼
 IT_小翼
发布于 2013/03/19 12:34
字数 715
阅读 73
收藏 5

在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

MySQL中的UNION

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

select * from gc_dfys union select * from ls_jg_dfys

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 

MySQL中的UNION ALL

而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:

select * from gc_dfys union all select * from ls_jg_dfys

 

使用Union,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT
使用Union all,则不会排重,返回所有的行

如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面:
(SELECT a FROM tbl_name WHERE a=10 AND B=1)  
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
麻烦一点也可以这么干:
select userid from (
select userid from testa union all select userid from testb) t 
order by userid limit 0,1;


如果你还想group by,而且还有条件,那么:
select userid from (select userid from testa union all select userid from testb) t group by userid having count(userid) = 2;

注意:在union的括号后面必须有个别名,否则会报错


当然了,如果当union的几个表的数据量很大时,建议还是采用先导出文本,然后用脚本来执行
因为纯粹用sql,效率会比较低,而且它会写临时文件,如果你的磁盘空间不够大,就有可能会出错
Error writing file '/tmp/MYLsivgK' (Errcode: 28)

放一个我们项目的例子吧。

select a.objectId, a.transUser, a.title, a.sendTime, a.readerState from (select
  t1.objectId,t2.transUser,t1.title,t1.sendTime,t2.State as readerState
  from MailSendInfo t1 ,AddressInfo t2 where t1.objectId = t2.objectId
  and t2.mailState = '1' and t2.staffid = #{staffId} and t2.enterNumber = #{enterNumber}
  union all
  select t1.objectId,'我自己的邮箱' transUser,t1.title,t1.sendTime,true as
  readerState
  from MailSendInfo t1 where t1.mailState = '2' and t1.staffid = #{staffId} and t1.enterNumber = #{enterNumber})
  as a order by a.sendTime DESC limit #{beginRow}, #{pageSize}

 

本文转载自:http://hi.baidu.com/dujiaopeng/item/b87de8a952956e9d151073b6

IT_小翼

IT_小翼

粉丝 44
博文 153
码字总数 36364
作品 0
西安
程序员
私信 提问
MySQL UNION

在本教程中,我们将学习如何使用MySQL UNION操作符从多个SELECT语句将两个或多个结果集组合成一个结果集。 MySQL UNION操作符 MySQL UNION运算符允许您从多个表查询出来的两个或多个结果集组...

易百教程
2016/09/14
29
0
MySQL中UNION和UNION ALL 详见

在MYSQL数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。 MySQL中的UNION ,UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会...

mn_1127
2013/12/10
260
0
MySQL UNION && UNION ALL

MySQL UNION && UNION ALL http://blog.itpub.net/29254281/viewspace-1190027/ http://my.oschina.net/xinxingegeya/blog/225646 建立如下表, type 分别为偶数 或 奇数 的查询结构, 这两个......

秋风醉了
2015/07/08
70
0
MySQL中UNION和UNION ALL的使用

在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。 MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产...

SibylY
2013/11/18
94
0
MySQL中UNION和UNION ALL的区别

在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。 MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产...

华宰
2011/05/03
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

setState() called after dispose() flutter

# 在setState前加入以下判断if (!mounted) return;

zdglf
22分钟前
3
0
docker和docker-compose二种方式安装mysql8.0

Docker方式安装 在命令行下运行 docker run -d -p 3306:3306 --restart always --privileged=true--name mysql-e MYSQL_USER="test" -e MYSQL_PASSWORD="test" -e MYSQL_ROOT_PASSWOR......

小白的成长
31分钟前
7
0
五大网络威胁应对挑战

既然如此,那么威胁的检测和响应过程是否像生产瑞士手表那样高效运行呢?答案远非如此。据ESG报告显示,威胁检测和响应过程充满各种各样的问题。来自372名企业网络安全和IT专家的数据,以下是...

linuxCool
32分钟前
5
0
jQuery 选择器使用大全(标签选择器,ID选择器等)

jQuery的选择器是CSS 1-3,XPath的结合物。jQuery提取这二种查询语言最好的部分,融合后创造出了最终的jQuery表达式查询语言。如果你了解CSS(绝大部分WEB开发者都用到的),那么你学起来就很...

前端老手
38分钟前
4
0
HBase四种部署模式和基本操作

本文主要包括两部分的内容,第一部分主要包HBase的四种安装方法,分别是:① 单机版模式,② 伪集群模式,③ 使用HBase自带的zookeeper构建分布式集群,④ 使用独立安装的zookeeper构建分布式...

繁荣3000
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部