先问大家一个问题,你觉得下面这条sql执行出来的结果是怎么样的?
select cast(100 as unsigned) as id union all select -100 as id
结果是:
100
0
是不是出乎你的意料?接下来正式开始正文。
一、说明
如果我们需要将两个select语句的结果作为一个整体显示出来,那么我们就要用到union或者union all关键字
二、语法
[SQL语句1]
union / union all
[SQL语句2]
三、两者区别
union:去重且排序(取唯一值,记录没有重复)
union all:不去重不排序(直接直连,取到所有值,记录可能有重复)
四、两者效率
从使用上说:
1、对重复结果的处理:union在进行表连接后会筛选掉重复的记录,union all 不会去除重复记录;
2、对排序的处理:union将会按照字段的顺序进行排序;union all 只是简单的将两个结果合并后就返回。
从效率上说:
union all 要比 union 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用union all
五、注意事项
1、union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来
比如:
select cast(100 as unsigned) as id union all select -100 as id union all select 200 as id
2、使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名
比如:
select cast(100 as unsigned) as id union all select -100 as dd
3、我们没有必要在每一个select结果集中使用order by子句来进行排序,我们可以在最后使用一条order by来对整个结果进行排序
比如:
select cast(100 as unsigned) as id union all select -100 as id order by id
4、两个要联合的SQL语句字段个数必须一样,而且字段类型要“相容”(一致)
最后想必大家都应该懂了为啥结果是100,0了吧