频道栏目
首页 > 数据库 > 其他综合 > 正文
union和union all的区别
2019-07-20 11:16:33           
收藏   我要投稿


众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考。

 

假设我们有一个表Student,包括以下字段与数据:

   www.firstop.com.cn  

drop table student;

 

create table student

(

id int primary key,

name nvarchar2(50) not null,

score number not null

);

 

insert into student values(1,'Aaron',78);

insert into student values(2,'Bill',76);

insert into student values(3,'Cindy',89);

insert into student values(4,'Damon',90);

insert into student values(5,'Ella',73);

insert into student values(6,'Frado',61);

insert into student values(7,'Gill',99);

insert into student values(8,'Hellen',56);

insert into student values(9,'Ivan',93);

insert into student values(10,'Jay',90);

   www.firstop.com.cn  

commit;

 

Union和Union All的区别。 

select *

from student

where id < 4

 

union

 

select *

from student

where id > 2 and id < 6

 

结果将是

 

1    Aaron    78

2    Bill    76

3    Cindy    89

4    Damon    90

5    Ella    73

 

如果换成Union All连接两个结果集,则返回结果是:

 

1    Aaron    78

2    Bill    76

3    Cindy    89

3    Cindy    89

4    Damon    90

5    Ella    73

 

可以看到,Union和Union All的区别之一在于对重复结果的处理。

 

接下来我们将两个子查询的顺序调整一下,改为

 

--Union

 

select *

from student

where id > 2 and id < 6

 

union

 

select *

from student

where id < 4

   www.firstop.com.cn  

看看执行结果是否和你期望的一致?

 

--Union All

 

select *

from student

where id > 2 and id < 6

 

union all

 

select *

from student

where id < 4

   www.firstop.com.cn  

那么这个呢?

 

据此我们可知,区别之二在于对排序的处理。Union All将按照关联的次序组织数据,而Union将进行依据一定规则进行排序。那么这个规则是?我们换个查询方式看看:

 

select score,id,name

from student

where id > 2 and id < 6

 

union

 

select score,id,name

from student

where id < 4

   www.firstop.com.cn  

结果如下:

 

73    5    Ella

76    2    Bill

78    1    Aaron

89    3    Cindy

90    4    Damon

 

和我们预料的一致:将会按照字段的顺序进行排序。之前我们的查询是基于id,name,score的字段顺序,那么结果集将按照id优先进行排序;而现在新的字段顺序也改变了查询结果的排序。并且,是按照给定字段a,b,c...的顺序进行的order by。即结果是order by a,b,c...........的。我们看下一个查询:

   www.firstop.com.cn  

select score,id,name

from student

where id > 2

 

union

 

select score,id,name

from student

where id < 4

 

结果如下:

 

56    8    Hellen

61    6    Frado

73    5    Ella

76    2    Bill

78    1    Aaron

89    3    Cindy

90    4    Damon

90    10    Jay

93    9    Ivan

99    7    Gill

   www.firstop.com.cn  

可以看到,对于score相同的记录,将按照下一个字段id进行排序。如果我们想自行控制排序,是不是用order by指定就可以了呢?答案是肯定的,不过在写法上有需要注意的地方:

 

select score,id,name

from student

where id > 2 and id < 7

 

union

 

select score,id,name

from student

where id < 4

 

union

   www.firstop.com.cn  

select score,id,name

from student

where id > 8

order by id desc

 

order by子句必须写在最后一个结果集里,排序时,必须使用第一个查询语句中的字段名、字段序号,并且其排序规则将改变操作后的排序结果.

 

(1) UNION中的所有选择列表必须具有相同列数、相似数据类型和相同的顺序   出现。

 

(2) 列名来自第一个SELECT语句。

 

(3) 若UNION中包含ORDER BY子句,则将对整个结果集排序。

 

(4) 在合并结果时,将从结果集中删除重复行。若使用ALL,结果集中包含所有    的行。

   www.firstop.com.cn  

对于Union、Union All、Intersect、Minus都有效。

 

=================================================================================================================

Intersect和Minus的操作和Union基本一致,这里一起总结一下:

 

Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

 

Union All,对两个结果集进行并集操作,包括重复行,不进行排序;

 

Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

 

Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。

 

可以在最后一个结果集中指定Order by子句改变排序方式。

   www.firstop.com.cn  

intersect运算:返回查询结果中相同的部分 

exp:各个部门中有哪些相同的工种? 

select job from 部门1 

intersect 

select job from 部门2 

intersect 

select job from 部门3;

   www.firstop.com.cn  

oracle:minus运算: 返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。 

在部门1中有,而在部门2中没有的工种 

exp:select job from 部门1 

minus  

select job from 部门2;

 

sqlserver中则是:except

 

 

作者 zk_software

点击复制链接 与好友分享!回本站首页
相关TAG标签
上一篇:PostgreSQL数据类型
下一篇:MongoVUE破解方法记录
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 第一门户--致力于做实用的IT技术学习网站