前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Union和Union All的差别

Union和Union All的差别

作者头像
全栈程序员站长
发布2021-12-12 14:27:51
5440
发布2021-12-12 14:27:51
举报

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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

代码语言:javascript
复制
drop table student;</p> <p>create table student<br />(<br />id int primary key,<br />name nvarchar2(50) not null,<br />score number not null<br />);</p> <p>insert into student values(1,’Aaron’,78);<br />insert into student values(2,’Bill’,76);<br />insert into student values(3,’Cindy’,89);<br />insert into student values(4,’Damon’,90);<br />insert into student values(5,’Ella’,73);<br />insert into student values(6,’Frado’,61);<br />insert into student values(7,’Gill’,99);<br />insert into student values(8,’Hellen’,56);<br />insert into student values(9,’Ivan’,93);<br />insert into student values(10,’Jay’,90);</p> <p>commit;<br /> 

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

代码语言:javascript
复制
SQL> select *<br />  2  from student<br />  3  where id<4<br />  4  union<br />  5  select *<br />  6  from student<br />  7  where id>2 and id<6<br />  8  ;</p> <p>        ID NAME                                SCORE<br />———- —————————— ———-<br />         1 Aaron                                  78<br />         2 Bill                                   76<br />         3 Cindy                                  89<br />         4 Damon                                  90<br />         5 Ella                                   73</p> <p>SQL> 

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

代码语言:javascript
复制
SQL> select *<br />  2  from student<br />  3  where id<4<br />  4  union all<br />  5  select *<br />  6  from student<br />  7  where id>2 and id<6<br />  8  ;</p> <p>        ID NAME                                SCORE<br />———- —————————— ———-<br />         1 Aaron                                  78<br />         2 Bill                                   76<br />         3 Cindy                                  89<br />         3 Cindy                                  89<br />         4 Damon                                  90<br />         5 Ella                                   73</p> <p>6 rows selected. 

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

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

代码语言:javascript
复制
SQL> select *<br />  2  from student<br />  3  where id>2 and id<6<br />  4  union<br />  5  select *<br />  6  from student<br />  7  where id<4<br />  8  ;</p> <p>        ID NAME                                SCORE<br />———- —————————— ———-<br />         1 Aaron                                  78<br />         2 Bill                                   76<br />         3 Cindy                                  89<br />         4 Damon                                  90<br />         5 Ella                                   73</p> <p>SQL> select *<br />  2  from student<br />  3  where id>2 and id<6<br />  4  union all<br />  5  select *<br />  6  from student<br />  7  where id<4<br />  8  ;</p> <p>        ID NAME                                SCORE<br />———- —————————— ———-<br />         3 Cindy                                  89<br />         4 Damon                                  90<br />         5 Ella                                   73<br />         1 Aaron                                  78<br />         2 Bill                                   76<br />         3 Cindy                                  89</p> <p>6 rows selected. 

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

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

代码语言:javascript
复制
SQL> select score,id,name<br />  2  from student<br />  3  where id<4<br />  4  union<br />  5  select score,id,name<br />  6  from student<br />  7  where id>2 and id<6<br />  8  ;</p> <p>     SCORE         ID NAME<br />———- ———- ——————————<br />        73          5 Ella<br />        76          2 Bill<br />        78          1 Aaron<br />        89          3 Cindy<br />        90          4 Damon 

但是看到,此时是依照字段SCORE来对结果进行排序的(前面SELECT *的时候是依照ID进行排序的)。

那么有人会问,假设我想自行控制排序,能不能使用ORDER BY呢?当然能够。只是在写法上有须要注意的地方:

代码语言:javascript
复制
select score,id,name<br />from student<br />where id > 2 and id < 7</p> <p>union</p> <p>select score,id,name<br />from student<br />where id < 4</p> <p>union</p> <p>select score,id,name<br />from student<br />where id > 8<br />order by id desc<br /> 

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

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

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

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

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

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

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118098.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档