Oracle中的union与order by

  1. 今天在工作中遇到了这个问题,搞不清楚这个执行顺序,搜索发现以下这篇博文讲的很详细,非常感谢博主.

  2. 假设我们有一个表Student,包括以下字段与数据:  
  3.   
  4. drop table student;  
  5.   
  6. create table student  
  7. (  
  8. id int primary key,  
  9. name nvarchar2(50) not null,  
  10. score number not null  
  11. );  
  12.   
  13. insert into student values(1,'Aaron',78);  
  14. insert into student values(2,'Bill',76);  
  15. insert into student values(3,'Cindy',89);  
  16. insert into student values(4,'Damon',90);  
  17. insert into student values(5,'Ella',73);  
  18. insert into student values(6,'Frado',61);  
  19. insert into student values(7,'Gill',99);  
  20. insert into student values(8,'Hellen',56);  
  21. insert into student values(9,'Ivan',93);  
  22. insert into student values(10,'Jay',90);  
  23.   
  24. commit;  
  25.   
  26. UnionUnion All的区别。  
  27. select *  
  28. from student  
  29. where id < 4  
  30.   
  31. union  
  32.   
  33. select *  
  34. from student  
  35. where id > 2 and id < 6  
  36.   
  37. 结果将是  
  38.   
  39. 1    Aaron    78  
  40. 2    Bill    76  
  41. 3    Cindy    89  
  42. 4    Damon    90  
  43. 5    Ella    73  
  44.   
  45. 如果换成Union All连接两个结果集,则返回结果是:  
  46.   
  47. 1    Aaron    78  
  48. 2    Bill    76  
  49. 3    Cindy    89  
  50. 3    Cindy    89  
  51. 4    Damon    90  
  52. 5    Ella    73  
  53.   
  54. 可以看到,UnionUnion All的区别之一在于对重复结果的处理。  
  55.   
  56. 接下来我们将两个子查询的顺序调整一下,改为  
  57.   
  58. --Union  
  59.   
  60. select *  
  61. from student  
  62. where id > 2 and id < 6  
  63.   
  64. union  
  65.   
  66. select *  
  67. from student  
  68. where id < 4  
  69.   
  70. 看看执行结果是否和你期望的一致?  
  71.   
  72. --Union All  
  73.   
  74. select *  
  75. from student  
  76. where id > 2 and id < 6  
  77.   
  78. union all  
  79.   
  80. select *  
  81. from student  
  82. where id < 4  
  83.   
  84. 那么这个呢?  
  85.   
  86. 据此我们可知,区别之二在于对排序的处理。Union All将按照关联的次序组织数据,而Union将进行依据一定规则进行排序。那么这个规则是?我们换个查询方式看看:  
  87.   
  88. select score,id,name  
  89. from student  
  90. where id > 2 and id < 6  
  91.   
  92. union  
  93.   
  94. select score,id,name  
  95. from student  
  96. where id < 4  
  97.   
  98. 结果如下:  
  99.   
  100. 73    5    Ella  
  101. 76    2    Bill  
  102. 78    1    Aaron  
  103. 89    3    Cindy  
  104. 90    4    Damon  
  105.   
  106. 和我们预料的一致:将会按照字段的顺序进行排序。之前我们的查询是基于id,name,score的字段顺序,那么结果集将按照id优先进行排序;而现在新的字段顺序也改变了查询结果的排序。并且,是按照给定字段a,b,c...的顺序进行的order by。即结果是order by a,b,c...........的。我们看下一个查询:  
  107.   
  108. select score,id,name  
  109. from student  
  110. where id > 2  
  111.   
  112. union  
  113.   
  114. select score,id,name  
  115. from student  
  116. where id < 4  
  117.   
  118. 结果如下:  
  119.   
  120. 56    8    Hellen  
  121. 61    6    Frado  
  122. 73    5    Ella  
  123. 76    2    Bill  
  124. 78    1    Aaron  
  125. 89    3    Cindy  
  126. 90    4    Damon  
  127. 90    10    Jay  
  128. 93    9    Ivan  
  129. 99    7    Gill  
  130.   
  131. 可以看到,对于score相同的记录,将按照下一个字段id进行排序。如果我们想自行控制排序,是不是用order by指定就可以了呢?答案是肯定的,不过在写法上有需要注意的地方:  
  132.   
  133. select score,id,name  
  134. from student  
  135. where id > 2 and id < 7  
  136.   
  137. union  
  138.   
  139. select score,id,name  
  140. from student  
  141. where id < 4  
  142.   
  143. union  
  144.   
  145. select score,id,name  
  146. from student  
  147. where id > 8  
  148. order by id desc  
  149.   
  150. order by子句必须写在最后一个结果集里,并且其排序规则将改变操作后的排序结果。对于UnionUnion AllIntersect、Minus都有效。  
  151.   
  152. 注意:  
  153.   
  154. 1,Union可以对字段名不同但数据类型相同的结果集进行合并;  
  155.   
  156. 2,如果字段名不同的结果集进行Union,那么对此字段的Order by子句将失效。  
  157.   
  158. =================================================================================================================  
  159.   
  160. Intersect和Minus的操作和Union基本一致,这里一起总结一下:  
  161.   
  162. Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;  
  163.   
  164. Union All,对两个结果集进行并集操作,包括重复行,不进行排序;  
  165.   
  166. Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;  
  167.   
  168. Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。  
  169.   
  170. 可以在最后一个结果集中指定Order by子句改变排序方式。 
转载自:http://blog.csdn.net/shutingwang/article/details/9932807
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值