组合查询中union 与union all的区别

       在SQL中所提供的几种运算符允许组合多个SQL查询来实现,如union、union all、intersect和difference。 在使用这些运算符时,从一个表中获取的数据必须和其他表中的数据具有相同的列数目,同时两个表中相对应的列必须具有相同的数据类型或者至少两个数据类型之间必须存在可能的隐形数据转化,或者是显式转化。为了能更好的理解这些运算符,主要区别一下union和union all 两者之间关系。

        通常情况下,union(即联合)的结果集列名与union 运算符中第一个select  语句的结果集中的列名相同,另一个select语句的结果集列名被忽略了。如在两个表professor表和student表中,我们运行下列命令:

select professorid,pro_name from professor union select studentid,stu_name from student

其结果集为:

professorid  pro_name

1 pro.dawson
1 李学思
2 pro.williams
2 张峰
3 pro.ashby
3 王俊
4 pro.patel
4 郝眼
5 pro.jones
5 李俊平
6 pro.hwa
6 林俊杰
7 吴丽丽
8 陈丽君
9 欧阳海
10 孙胜利
11 吴文杰
12 勾西平
23 hhg

       虽然上面的举例很直观,但是在集合理论中,两个数据集联合后包括包含每个数据的每个成员,但是每个成员只被计数一次。

{1,2,3,4} union {3,4,5,6},其结果为:{1,2,3,4,5,6}

       与之相不同的union all 则是保留重复行,换句话讲,此运算符返回每个数据集的所有成员,而不考虑重复。比如:同样在两个表professor表和student表中,我们运行下列命令:

select professorid,pro_name from professor union  all select studentid,stu_name from student

其结果集为:

professorid  pro_name

1 pro.dawson
2 pro.williams
3 pro.ashby
4 pro.patel
5 pro.jones
6 pro.hwa
1 李学思
2 张峰
3 王俊
4 郝眼
5 李俊平
6 林俊杰
7 吴丽丽
8 陈丽君
9 欧阳海
10 孙胜利
11 吴文杰
12 勾西平
23 hhg

       更直观的比方说{1,2,3,4} union all {3,4,5,6} ,其结果为:{1,2,3,3,4,4,5,6}

       简单的提示一下,sql中的intersect运算符允许仅返回在两个查询都出现的行,相当于数学上所学的交集。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章