oracle union 用法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值