关于union和join区别和联系

nionjoin是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确。

先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同的(Schema of both sides of union shouldmatch.)。也就是说如果A表中有三条数据,B表中有两条数据,那么A union B就会有五条数据。说明一下union union all的差别,对于union如果存在相同的数据记录会被合并,而union all不会合并相同的数据记录,该有多少条记录就会有多少条记录。例如在mysql下执行以下语句:

select * fromtmp_libingxue_a;

name number

libingxue 1001

yuwen 1002

select * fromtmp_libingxue_b;

name number

libingxue 1001

feiyao 1003

select * fromtmp_libingxue_a union select * from tmp_libingxue_b;

libingxue 1001

yuwen 1002

feiyao 1003

select * fromtmp_libingxue_a union all select * from tmp_libingxue_b;

libingxue 1001

yuwen 1002

libingxue 1001

feiyao 1003

但是这样在hive里面是不能执行的,执行select * from tmp_libingxue_a union allselect * from tmp_libingxue_b;failedhiveunion必须在子查询中进行。如

select * from(select * from tmp_yuwen_a union all select * from tmp_yuwen_b) t1;

注意,必须是union all,单独用union它会提示你缺少ALL,而且后面的t1必须写,你可以写成a或者b,但是一定要写,不写会出错。

join则是偏于横向的联合,仅仅是偏向于,等下详细说明。joinunion比起来显得更宽松,对两个表的字段不做要求,没有限制条件的join等于两个表的笛卡尔乘积,所有join需要有限制条件来约束,经过限制的join就是横向的扩张了。对于满足限制条件的join会被提取出来,不满足的直接过滤掉。用法可以很灵活,下面有两个简单的例子:

select * from(select * from tmp_yuwen_at1 join (select * from tmp_yuwen_b) t2;

select * fromtmp_yuwen_a t1 join (select * from tmp_yuwen_b) t2;

left outer joinright outer join用法类似,区别就是left outer join会把左边表的字段全部选择出来,右边表的字段把符合条件的也选择出来,不满足的全部置空,也就是说以左边表为参照。right outer join同理以右边表为参照。这三个join之间的差别说过很多次,网上也有更详细的解释,不再赘述。

相同点:在某些特定的情况下,可以用join实现union all的功能,这种情况是有条件的,当出现这种情况的时候选择union all还是group by就可以看情况或者看两者的消耗而决定。sql虽然就在那么几个关键词,但变化多端、功能强大,只要能实现想要的功能,怎么用随便你。需求情况sql简单重现如下

drop tabletmp_libingxue_resource;

create externaltable if not exists tmp_libingxue_resource(

user_id string,

shop_id string,

auction_id string,

search_time string

)partitioned by(pt string)

row formatdelimited fields terminated by '\t'

lines terminatedby '\n'

stored assequencefile;

 

drop tabletmp_libingxue_result;

create externaltable if not exists tmp_libingxue_result(

user_id string,

shop_id string,

auction_id string,

search_time string

)partitioned by(pt string)

row formatdelimited fields terminated by '\t'

lines terminatedby '\n'

stored assequencefile;

 

insert overwritetable tmp_libingxue_result where(pt=20041104) select * fromtmp_libingxue_resource;

 

sudo -u taobaohadoop dfs -rmr /group/tbads/warehouse/tmp_libingxue_result/pt=20041104

sudo -u taobaohadoop jar /home/taobao/dataqa/framework/DailyReport.jarcom.alimama.loganalyzer.tool.SeqFileLoader tmp_libingxue_resource.txthdfs://v039182.sqa.cm4:54310/group/tbads/warehouse/tmp_libingxue_result/pt=20041104/part-00000

 

hive> select *from tmp_libingxue_resource;

OK

2001 0 11 10120041104

2002 0 11 102 20041104

hive> select *from tmp_libingxue_result;

OK

2001 0 12 10320041104

2002 0 12 10420041104

 

selectuser_id,shop_id,max(auction_id),max(search_time)

from

(select * fromtmp_libingxue_resource

union all

select * fromtmp_libingxue_result )t1

group byuser_id,shop_id;

2001 0 12 103

2002 0 12 104

 

selectt1.user_id,t1.shop_id,t2.auction_id,t2.search_time

from

(select * fromtmp_libingxue_resource) t1

join

(select * fromtmp_libingxue_result) t2

ont1.user_id=t2.user_id and t1.shop_id=t2.shop_id;

2001 0 12 103

2002 0 12 104

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值