思维导图
在很多查询场景中,数据往往来源于多个表,所以需要将多个表连接起来进行查询,即多表查询
Q1:简要介绍join连接,以及如何使用join进行简单的表连接?
1.join
-
join是以字段(列)为单位来连接的,在日常工作中使用广泛
-
join根据两个或多个表的字段之间的关系,将这些表连接起来,形成一个信息更为全面的表,从这个表中查询数据
-
不同于MySQL,Hive中是没有索引的,因此每次查询都要进行全量扫描。通过增加分区可以减少每次扫描的数据量,将需要参与计算的数据限定在某个范围之内。
2.分区表
(1)增量表
-
例:students_grade表,每一条的分区只记录当天的考试成绩
students_grade
(2)全量表
-
例:student_gender表,每一天新的分区会记录所有的历史数据,并且会更新此前的信息,查询时只需选择最新的分区即可
student_gender
3.表连接
-
将students_grade和student_gender连接起来进行查询(基于id字段进行连接,id字段具有唯一性)
-
最外层的select语句内部包含了两条select语句,称为子查询
-
写子查询时,要保证相同层级的子查询缩进对齐,以提高可读性
Q2:简要阐述join的不同连接方式及其区别。
下面出现的连接结果均为Q1中两表的连接结果。
1.inner join(内连接)
-
Hive中只写了join,默认是inner join
-
只保留了两个表中同时存在的记录
-
连接结果:(只有两个表都有的id对应的记录才会出现在结果表中)
inner join
2.left join(左连接)
左表:SQL语句中前一个关联的表
右表:SQL语句中后一个关联的表
-
保留左表所有的记录,无论其是否能够在右表匹配到对应的记录
-
若无匹配记录,则需要用NULL填补
-
连接结果:(student_grade表的所有记录都被保留)
left join
3.right join(右连接)
-
保留右表所有的记录,无论其是否能够在左表匹配到对应的记录
-
若无匹配记录,则需要用NULL填补
-
连接结果:
right join
4.full join(全连接)
-
左表和右表所有的记录都会保留,没有匹配记录的用NULL填补
-
连接结果:(结果表实际上就是left join结果表和right join结果表的并集)
full join
Q3:简要介绍union连接,以及如何使用union进行表连接?
1.union
-
union是基于记录(行)进行连接的,需要保证连接的两个表的字段数量相同,并且所有字段按照顺序一一对应
-
假设有两个表记录了学生的性别信息,现在需要将这两个表连接起来得到所有学生的性别信息:
students_gender_new
students_gender_old
-
代码示例:
-
输出结果:
2.union和union all
-
union 语句会在union all的基础上进行去重操作
-
MySQL同时支持union和union all操作
-
Hive只支持union all操作
参考文献
1.《拿下Offer 数据分析师求职面试指南》徐麟 著