版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37050372/article/details/81901856
select
join
inner join
left join == left outer join
right join == right outer join
full outer join
我们先来创建数据和表:
内连接(内连接的本质其实是取笛卡尔集):
select a.*,b.* from t_a a join t_b b on a.id = b.id;
左外连接:
select a.*,b.* from t_a a left join t_b b on a.id = b.id;
右外连接:
select a.*,b.* from t_a a right join t_b b on a.id = b.id;
全外连接:
select a.*,b.* from t_a a full join t_b b on a.id = b.id;
半连接:
我们先来对比一下:
select a.* from t_a a join t_b b on a.id = b.id
这里是查出左边的一半:
select a.* from t_a a left semi join t_b b on a.id = b.id;
我们可以看到上面使用内连接查询左边的一半用了6.639秒,而使用半连接用时5.133秒效率明显提高了。
所以如果我们只想查询一半的数据可以使用semi半连接来提高mapreduce的效率。
这是为什么呢?因为如果我们使用内连接来查询一半的话,它会把两张表的数据都发送到reduce端做聚合,而使用semi半连接,则不会发送所有的数据。
不等值查询:
select a.*,b.* from t_a a join t_b b on a.id > b.id;
select a.*,b.* from t_a a , t_b b where a.id > b.id;
在老版本中,不支持非等值的join
在1.2.1后都支持非等值join,不过写法应该如下:
select a.*,b.* from t_a a , t_b b where a.id > b.id;
不支持的语法:
select a.*,b.* from t_a a join t_b b on a.id > b.id;