在使用数据库查询的时候,有的时候是需要把多个查询结果作为一个整体输出,这个时候我们就需要使用UNION&UNION ALL
UNION&UNION ALL 作用
UNION&UNION ALL(或称为联合)的作用是将多个结果合并在一起显示出来。
UNION&UNION ALL 区别
UNION:对多个结果集进行并集操作并且去除重复结果,同时进行默认规则的排序
UNION ALL:仅仅对多个结果集进行并集操作,不去除重复记录,不进行排序按照关联的次序显示数据
其他操作:
INTERSECT:对多个结果集进行交集操作并且去除重复结果,同时进行默认规则的排序
MINUS:对两个结果集进行差操作并且去除重复结果,同时进行默认规则的排序
效率对比:UNION比UNION ALL 效率低,如果明确确认集合中不包括重复记录则使用UNION ALL ,如果表数据很大可能会导致用磁盘进行排序耗费时间
使用注意:union和union all 合并的两个或多个查询结果:列数、顺序相同;对应列的数据类型可以不同但是必须兼容(所谓的兼容是指两种类型之间可以进行隐式转换,不能进行隐式转换则报错),也可以用显式转换为相同的数据类型;如果为XML数据类型则列必须等价(所有列都必须类型化为 XML 架构,或者为非类型化),如果类型化,这些列必须类型化为相同的 XML 架构集合。
引自:https://blog.youkuaiyun.com/qq_34869143/article/details/66974540
UNION&UNION ALL 示例
UNION 示例
-- union
select t.stuname as name from STUDENT t
union
select t2.name as name from STUDENT2 t2
结果截图:
UNION ALL 示例
-- union all
select t.stuname as name from STUDENT t
union all
select t2.name as name from STUDENT2 t2
UNION&UNION ALL 排序
UNION排序是按照字段的优先顺序排序的,但是我们也可以指定某一个字段排序,但是UNION/UNION ALL排序时,不管有多少个被union的部分,都只有最后一行一个order by子句,且UNION/UNION ALL的order by子句只能通过列号来标示你要排序的字段
-- union 按照姓名排序
select t.stuid, t.stuname as name from STUDENT t
union
select t2.id, t2.name as name from STUDENT2 t2
order by 2