Hadoop之Hive的Join语句

Posted 柳小葱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop之Hive的Join语句相关的知识,希望对你有一定的参考价值。

😊昨天我们学习了数据库的DML语言,主要包括数据的导入、导出和查询,💘有兴趣的小伙伴可以看看👇:

🐶今天我们来继续学习Hive的Join部分。听说Join有7种哦!

1.内连接

在这里插入图片描述

Hive支持通常的SQL JOIN语句,等值连接是将两张表中的相同字段信息连接起来

  • 根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;
--内连接
select e.empno, e.ename, d.deptno, d.dname
from emp e join dept d
on e.deptno=d.deptno;

在这里插入图片描述

2.左外连接

在这里插入图片描述
左外连接会将左表的数据全部展示,没有连接的部分将会补null值

  • 根据员工表和部门表中的部门编号相等,查询员工编号、员工名称、部门编号和部门名称;如果没有则用null补充
select e.empno,e.ename,e.deptno,d.dname
from emp e left join dept d 
on e.deptno=d.deptno;

在这里插入图片描述

3.右外连接

  • 查询所有部门中对应的员工信息
select e.empno,e.ename,e.deptno,d.dname
from emp e right join dept d 
on e.deptno=d.deptno;

在这里插入图片描述

4.全外连接

在这里插入图片描述

  • 查询所有员工信息和部门信息
select e.empno,e.ename,e.deptno,d.dname
from emp e full join dept d 
on e.deptno=d.deptno;

在这里插入图片描述

5.差值

5.1 左表独有

在这里插入图片描述
这里的差值就是A左连接B的结果在减去A和B的交集。

  • 查询所在部门为null的员工信息
select e.empno,e.ename,e.deptno,d.dname
from emp e left join dept d
on e.deptno=d.deptno
where d.deptno is null;

在这里插入图片描述
我们也可以采用子查询,不过效率太低了

select e.empno,e.ename,e.deptno,d.dname
from emp e
where e.deptno not in (select deptno from dept);

5.2右表独有

在这里插入图片描述

  • 查询部门中不存在任何员工信息的部门信息
select d.deptno,d.dname
from emp e right join dept d
on e.deptno=d.deptno
where e.deptno is null;

在这里插入图片描述

6.左右表独有

在这里插入图片描述

  • 查询员工表特有信息和部门表的特有信息
--在全外连接的基础上操作
select e.empno,e.ename,e.deptno,d.dname
from emp e full join dept d 
on e.deptno=d.deptno
where e.deptno is null or d.deptno is null;

在这里插入图片描述
也可以使用左右差值的结果做并集

select * from(
select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e left join dept d
on e.deptno=d.deptno
where d.deptno is null
union
select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e right join dept d
on e.deptno=d.deptno
where e.deptno is null)tmp;

在这里插入图片描述

8.多表连接

我们准备添加一个表的数据

1700	Beijing
1800	London
1900	Tokyo

在这里插入图片描述

  • 查询员工姓名,部门名称和部门所在城市名称
--三表连接,顺序从左到右
select e.ename,d.dname,l.loc_name
from emp e join dept d on e.deptno=d.deptno
join location l on d.loc=l.loc;

优化:当对 3 个或者更多表进行 join 连接时,如果每个 on 子句都使用相同的连接键的话,那么只会产生一个 MapReduce job
在这里插入图片描述

9.笛卡尔积

笛卡尔积会在什么情况下产生呢?

  • 省略连接条件
  • 连接条件无效
  • 所有表中的所有行相互连接

案例:

--笛卡尔积
select empno,dname from emp,dept;

结果如下:
在这里插入图片描述

参考资料

《大数据Hadoop3.X分布式处理实战》

以上是关于Hadoop之Hive的Join语句的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop之Hive的分区表

hive 之 交、并、差 探析

阿里云MaxComputer SQL学习之DML

Hive Join 优化之 Map Join

Hadoop之Hive查询语句

hadoop之hive建表语句备份