MySQL中UNION和UNION ALL的使用

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

MySQL中的UNION 数据库

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

select * from gc_dfys union select * from ls_jg_dfys code

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

MySQL中的UNION ALL it

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

从效率上说,UNION ALL 要比UNION快不少,因此,若是能够确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,以下: test

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) object

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

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}
相关文章
相关标签/搜索