当前位置:操作系统 > Unix/Linux >>

数据库的Union、Union All、Intersect、Minus


数据库的Union、Union All、Intersect、Minus
 
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
  www.zzzyk.com  
具体讲讲Union和Union All。先来看一个例子:
 
有一张学生表student如下:
id name score
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
6 Frado 61
7 Gill 99
8 Hellen 56
9 Ivan 93
10 Jay 90
 
看看以下4段SQL语句
[sql] 
1)  
select * from student where id<4  
union  
select * from student where 2<id and id<6  
  
2)  
select * from student where 2<id and id<6  
union  
select * from student where id<4  
    www.zzzyk.com  
3)  
select * from student where id<4  
union all  
select * from student where 2<id and id<6  
  
4)  
select * from student where 2<id and id<6  
union all  
select * from student where id<4  
 
看看4段SQL语句的执行结果:
id name score
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
同上
  www.zzzyk.com  
id name score
1 Aaron 78
2 Bill 76
3 Cindy 89
3 Cindy 89
4 Damon 90
5 Ella 73
id name score
3 Cindy 89
4 Damon 90
5 Ella 73
1 Aaron 78
2 Bill 76
3 Cindy 89
从以上四个结果来看,可以得出结论:Union是不可重复的,有序的。Union All是可以重复的,无序的。
 
那么Union的自动排序的默认规则是什么呢?
众多周知,以上的select *就相当于select id, name, score。默认排序规则是按照select之后的第一个字段排序,也就是id。如果想要按照score排序,可以这样写:select score, id, name。
那么可不可以用order by排序呢,答案是:可以。不过order by一定要写到最后一个结果集里,如下面SQL语句:
 
[sql] 
select * from student where 2<id and id<6  
union    www.zzzyk.com  
select * from student where id<4  
order by score  
order by 排序对于Union、Union All、Intersect、Minus都有效。
 
 
摘自 殇雲的专栏
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,