[SQL]SQL Server 之 UNION(原创)

转载:http://www.cnblogs.com/netserver/archive/2008/12/25/1362409.html
UNION 将两个或更多查询的结果合并为单个结果集,该结果集包含联合查询中的所有查询的全部行。UNION 运算不同于使用联接合并两个表中的列的运算。
下面列出了使用 UNION 合并两个查询结果集的基本规则:
   1、所有查询中的列数和列的顺序必须相同。
   2、数据类型必须兼容(相同或可隐式转换)。
语法:
查询表达式1 UNION [ALL] 查询表达式2
select fields from tableA UNION select fields from tableB
查询表达式:
查询表达式或查询规范,用以返回与另一个查询规范或查询表达式所返回的数据合并的数据。作为 UNION 运算一部分的列定义可以不相同,但它们必须通过隐式转换实现兼容。如果数据类型不同,则根据数据类型优先顺序规则确定所产生的数据类型。如果类型相同,但 精度、小数位数或长度不同,则根据用于合并表达式的相同规则来确定结果。
UNION:
指定合并多个结果集并将其作为单个结果集返回。使用UNION会自动排除相同的记录,删除重复行。(类似与单一查询的DISTINCT。)
ALL:
将全部行并入结果中。其中包括重复行。如果未指定该参数,则删除重复行。

例表A:UA 例表B:UB

注意:SQL UNION会自动排除相同的记录,删除重复行。这里的相同记录指的是要用UNION合并两个查询结果的所有字段的值都相同。

select AID,ANAME,ASEX from UA union select BID,BNAME,BSEX from UB
说明:
1、UA表中有三个字段,UB表中有四个三字,但UNION考虑前后两个查询果(并不是实际表中的数据)的列数要一致,即都是三个字段,且字段的数据类型一致就行了,结果如左图所示。
如果用:select * from UA union select * from UB
或 select AID,ANAME,ASEX from UA union select BID,BNAME,BSEX,BAddress from UB
因为列数不一致,将抛出错误。
2、UNION会自动删除重复行。结果中姓名为"马艳艳"的,虽然性别、姓名都一样,但因为ID不同,则不认为是重复的记录,也就是说这里的重复记录指的是两个查询结果中的所有字段的值都是一样的。如:姓名为"邓事文"的记录则认为重复记录,只保留一条。

UNION会自动删除重复行(记录)的演示:
select AID from UA union select bid from UB
select ANAME from UA union select BNAME from UB
select ASEX from UA union select BSEX from UB
注意:因为前面的是主表,所以结果中的字段名都是UA表中的字段名。

再来看字段数据类型要一致的演示:
select AID,ANAME,ASEX from UA union select BID,BNAME,BAddress from UB
说明:
因为UA表中的ASEX与UB表中的BAddress都为varchar数据类型,所以结果如左图所示。
如果类型相同,但精度、小数位数或长度不同,则根据用于合并表达式的相同规则来确定结果。
select ANAME,ASEX from UA union select BNAME,BID from UB
select ANAME,AID from UA union select BNAME,BSEX from UB
错误提示:在将 varchar 值 '女' 转换成数据类型 int 时失败。
可以对数据类型进行转换后再UNION
select ANAME,cast(AID as varchar) from UA union select BNAME,BSEX from UB
如果用:select ANAME,AID from UA union select BNAME,BSEX from UB
不进行数据类型的转换,将会出现错误。
最后看看UNION ALL:
select AID,ANAME,ASEX from UA union all select BID,BNAME,BSEX from UB
说明:
UNION ALL 也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将左右两个查询的结果的所有的资料都列出来,无论资料值有无重复。
左图结果中,姓名为"邓事文"的记录,在两个查询中是完全相同的。对比上面第一次试验的结果(9条记录),现在这次因为用了UNION ALL 姓名为"邓事文"的记录不管它是否重复,都分别从两个查询结果中取了出来(结果为10条记录)。
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏