Union和Union All的差别

本文详细介绍了SQL中的UNION、UNION ALL、INTERSECT和MINUS集合操作符的用法、区别及排序规则,包括如何在结果集中指定ORDER BY子句改变排序方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果我们有一个表Student,包含下面字段与数据:

 

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); commit;

 

首先,我们来看一下UNION的样例:


SQL> select * 2 from student 3 where id<4 4 union 5 select * 6 from student 7 where id>2 and id<6 8 ; ID NAME SCORE ---------- ------------------------------ ---------- 1 Aaron 78 2 Bill 76 3 Cindy 89 4 Damon 90 5 Ella 73 SQL>

 

假设换成Union All连接两个结果集,则结果例如以下:

 

SQL> select * 2 from student 3 where id<4 4 union all 5 select * 6 from student 7 where id>2 and id<6 8 ; ID NAME SCORE ---------- ------------------------------ ---------- 1 Aaron 78 2 Bill 76 3 Cindy 89 3 Cindy 89 4 Damon 90 5 Ella 73 6 rows selected.

 

能够看到,Union和Union All的差别之中的一个在于对反复结果的处理。

 

接下来,我们交换一个两个SELECT语句的顺序,看看结果是如何的。

 

SQL> select * 2 from student 3 where id>2 and id<6 4 union 5 select * 6 from student 7 where id<4 8 ; ID NAME SCORE ---------- ------------------------------ ---------- 1 Aaron 78 2 Bill 76 3 Cindy 89 4 Damon 90 5 Ella 73 SQL> select * 2 from student 3 where id>2 and id<6 4 union all 5 select * 6 from student 7 where id<4 8 ; ID NAME SCORE ---------- ------------------------------ ---------- 3 Cindy 89 4 Damon 90 5 Ella 73 1 Aaron 78 2 Bill 76 3 Cindy 89 6 rows selected.

 

能够看到,对于UNION来说,交换两个SELECT语句的顺序后结果仍然是一样的,这是由于UNION会自己主动排序。而UNION ALL在交换了SELECT语句的顺序后结果则不同样,由于UNION ALL不会对结果自己主动进行排序。

 

那么这个自己主动排序的规则是什么呢?我们交换一下SELECT后面选择字段的顺序(前面使用SELECT *相当于SELECT ID,NAME,SCORE),看看结果怎样:

 

SQL> select score,id,name 2 from student 3 where id<4 4 union 5 select score,id,name 6 from student 7 where id>2 and id<6 8 ; SCORE ID NAME ---------- ---------- ------------------------------ 73 5 Ella 76 2 Bill 78 1 Aaron 89 3 Cindy 90 4 Damon

 

但是看到,此时是依照字段SCORE来对结果进行排序的(前面SELECT *的时候是依照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 select score,id,name from student where id > 8 order by id desc

 

order by子句必须写在最后一个结果集里,而且其排序规则将改变操作后的排序结果。对于Union、Union All、Intersect、Minus都有效。

 

其它的集合操作符,如Intersect和Minus的操作和Union基本一致,这里一起总结一下:

 

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

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

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

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

 

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

 

 

 

转载于:https://www.cnblogs.com/bhlsheji/p/4068986.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值