码迷,mamicode.com
首页 > 其他好文 > 详细

hive内联接和外联接

时间:2019-07-29 21:47:37      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:form   sele   nes   表数据   lis   mina   用例   通过   creat   

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;

技术图片

 

hive内联接和外联接

标签:form   sele   nes   表数据   lis   mina   用例   通过   creat   

原文地址:https://www.cnblogs.com/rensui4726/p/11266486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!