hive内联接和外联接

hql很多语句和sql有相似之处,下面用例子快速了解内外联接的用法

在多表操作的时候,经常会遇到需要的数据,一部分存在a表,一部分存在b表,或者存在更多的表中。

而我们可以从这些表的关系进行联接,下面创建两个表进行实例演示:

首先创建一个学生信息表,有id,s_name,c_name三个属性

hive> create table stu_msg(
    > id string,
    > s_name string,
    > c_name string)
    > row format delimited
    > fileds terminated by ','
    > ;

再创建一个成绩表,有id,score两种属性

hive> create table score_msg(
    > id string
    > ,score int)
    > row format delimited
    > fields terminated by ','
    > lines terminated by '\n';

添加对应数据于两表之中:

insert into table stu_msg values('1','zhangsan','math'),('2','lisi','english'),('3','wangwu','history');
insert into table score_msg values('1',99),('3',88),('4',66);

在两个表之间,不难发现学生表的id和成绩表的id存在关系,所以我们可以通过二者的关系进行联接查询。

一、首先是内联接(通过指定关系对A和B表进行匹配,把能匹配到的结果进行返回,匹配不到的则不返回):

select stu_msg.*,score_msg.* from stu_msg inner join score_msg on stu_msg.id=score_msg.id;

返回结果就是id为1和2的学生信息和成绩,为什么3的信息和4的成绩不返回呢?

因为在学生表中,id为3的学生在成绩表中并没有信息,所以匹配不到对应数据,而id为4的学生在学生表中却没有信息,只有成绩,也同样无法进行匹配,而内联接中,无法匹配的就不会查询返回出来。

二、外联接(左联接,右联接,完全联接...)

1、左连接:

select stu_msg.*,score_msg.* from stu_msg left join score_msg on stu_msg.id=score_msg.id;

返回结果:

不难发现,学生表的数据全部返回,而成绩表的数据id为4的同学依然没有打印出来,而且结果还有两个空值。

以left join 为中心,stu_msg为左侧表,而score_msg为右侧表,左联接就是通过以左表对指定属性进行匹配,不管匹配是否成功,左表数据全部返回,而右表数据只返回被成功匹配的。

空值是因为,左表数据没有对应的数据进行匹配,就以null来代替。

2、反之右联接的结果如下:

select stu_msg.*,score_msg.* from stu_msg right join score_msg on stu_msg.id=score_msg.id;

3、完全联接:

select stu_msg.*,score_msg.* from stu_msg full join score_msg on stu_msg.id=score_msg.id;

猜你喜欢

转载自www.cnblogs.com/rensui4726/p/11266486.html