加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Hive中union与union all用法

(2014-11-18 22:03:47)
标签:

union

unionall

分类: hadoop/hive

假设我们有一个表Student,包括以下字段与数据:

 

 

  1. drop table student;  
  2.   
  3. create table student  
  4.  
  5. id int primary key,  
  6. name nvarchar2(50) not null 
  7. score number not null  
  8. );  
  9.   
  10. insert into student values(1,'Aaron',78);  
  11. insert into student values(2,'Bill',76);  
  12. insert into student values(3,'Cindy',89);  
  13. insert into student values(4,'Damon',90);  
  14. insert into student values(5,'Ella',73);  
  15. insert into student values(6,'Frado',61);  
  16. insert into student values(7,'Gill',99);  
  17. insert into student values(8,'Hellen',56);  
  18. insert into student values(9,'Ivan',93);  
  19. insert into student values(10,'Jay',90);  
  20.   
  21. commit;  

 

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


  1. SQL> select  
  2.    from student  
  3.    where id<4  
  4.    union  
  5.    select  
  6.    from student  
  7.    where id>2 and id<6  
  8.     
  9.   
  10.         ID NAME                                SCORE  
  11. ---------- ------------------------------ ----------  
  12.          Aaron                                  78  
  13.          Bill                                   76  
  14.          Cindy                                  89  
  15.          Damon                                  90  
  16.          Ella                                   73  
  17.   
  18. SQL>  

 

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

 

 

  1. SQL> select  
  2.    from student  
  3.    where id<4  
  4.    union all  
  5.    select  
  6.    from student  
  7.    where id>2 and id<6  
  8.     
  9.   
  10.         ID NAME                                SCORE  
  11. ---------- ------------------------------ ----------  
  12.          Aaron                                  78  
  13.          Bill                                   76  
  14.          Cindy                                  89  
  15.          Cindy                                  89  
  16.          Damon                                  90  
  17.          Ella                                   73  
  18.   
  19. rows selected.  

 

可以看到,Union和Union All的区别之一在于对重复结果的处理。

 

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

 

 

  1. SQL> select  
  2.    from student  
  3.    where id>2 and id<6  
  4.    union  
  5.    select  
  6.    from student  
  7.    where id<4  
  8.     
  9.   
  10.         ID NAME                                SCORE  
  11. ---------- ------------------------------ ----------  
  12.          Aaron                                  78  
  13.          Bill                                   76  
  14.          Cindy                                  89  
  15.          Damon                                  90  
  16.          Ella                                   73  
  17.   
  18. SQL> select  
  19.    from student  
  20.    where id>2 and id<6  
  21.    union all  
  22.    select  
  23.    from student  
  24.    where id<4  
  25.     
  26.   
  27.         ID NAME                                SCORE  
  28. ---------- ------------------------------ ----------  
  29.          Cindy                                  89  
  30.          Damon                                  90  
  31.          Ella                                   73  
  32.          Aaron                                  78  
  33.          Bill                                   76  
  34.          Cindy                                  89  
  35.   
  36. rows selected.  

 

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

 

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

 

 

  1. SQL> select score,id,name  
  2.    from student  
  3.    where id<4  
  4.    union  
  5.    select score,id,name  
  6.    from student  
  7.    where id>2 and id<6  
  8.     
  9.   
  10.      SCORE         ID NAME  
  11. ---------- ---------- ------------------------------  
  12.         73          Ella  
  13.         76          Bill  
  14.         78          Aaron  
  15.         89          Cindy  
  16.         90          Damon  

 

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

 

那么有人会问,如果我想自行控制排序,能不能使用ORDER BY呢?当然可以。不过在写法上有需要注意的地方:

 

 

  1. select score,id,name  
  2. from student  
  3. where id and id  
  4.   
  5. union  
  6.   
  7. select score,id,name  
  8. from student  
  9. where id  
  10.   
  11. union  
  12.   
  13. select score,id,name  
  14. from student  
  15. where id  
  16. order by id desc  

 

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

 

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

 

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

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

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

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

 

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

注:本文转载自:http://blog.csdn.net/wanghai__/article/details/4712555/


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有