大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。
如果我们有一个表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