Union和Union All的差别

2021-12-12 14:27:51 浏览数 (1)

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

如果我们有一个表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

0 人点赞