mysql join union_MySQL中union和join语句使用区别的辨析教程

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

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

select * from tmp_libingxue_a;

name number

libingxue 1001

yuwen 1002

select * from tmp_libingxue_b;

name number

libingxue 1001

feiyao 1003

select * from tmp_libingxue_a union select * from tmp_libingxue_b;

libingxue 1001

yuwen 1002

feiyao 1003

select * from tmp_libingxue_a union all select * from tmp_libingxue_b;

libingxue 1001

yuwen 1002

libingxue 1001

feiyao 1003

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

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

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

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

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

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

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

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

drop table tmp_libingxue_resource;

create external table if not exists tmp_libingxue_resource(

user_id string,

shop_id string,

auction_id string,

search_time string

)partitioned by (pt string)

row format delimited fields terminated by '\t'

lines terminated by '\n'

stored as sequencefile;

drop table tmp_libingxue_result;

create external table if not exists tmp_libingxue_result(

user_id string,

shop_id string,

auction_id string,

search_time string

)partitioned by (pt string)

row format delimited fields terminated by '\t'

lines terminated by '\n'

stored as sequencefile;

insert overwrite table tmp_libingxue_result where(pt=20041104) select * from tmp_libingxue_resource;

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

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

hive> select * from tmp_libingxue_resource;

OK

2001 0 11 101 20041104

2002 0 11 102 20041104

hive> select * from tmp_libingxue_result;

OK

2001 0 12 103 20041104

2002 0 12 104 20041104

select user_id,shop_id,max(auction_id),max(search_time)

from

(select * from tmp_libingxue_resource

union all

select * from tmp_libingxue_result )t1

group by user_id,shop_id;

2001 0 12 103

2002 0 12 104

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

from

(select * from tmp_libingxue_resource) t1

join

(select * from tmp_libingxue_result) t2

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

2001 0 12 103

2002 0 12 104

通过前面的介绍,使用UNION对表的结果集进行并运算与使用JOIN对多表进行连接,二者有本质的不同。

下面给出一个使用UNION运算符连接二表记录的运算实例。

典型的二表记录的UNION运算

假定有两个表Table3和Table4,其包含的列和数据分别如下所示。

Table1数据库表

20151216110017983.png?2015111611026

Table2数据库表

20151216110102452.png?2015111611111

Table1表和Table2表具有相同的列结构,因此可以使用UNION运算符连接两个表的记录集,得到的连接结果如下表所示。

使用UNION连接Table3表和Table4表的记录

20151216110125850.png?2015111611132

上述连接过程的实现代码可表示如下:

SELECT *

FROM Table1

UNION

SELECT *

FROM Table2

本文标题: MySQL中union和join语句使用区别的辨析教程

本文地址: http://www.cppcns.com/shujuku/mysql/137305.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值