????????Join语句主要做多表关联查询:当我们需要的数据来自多张表,多张表之间还有连接关系,我们就可以使用连接查询获取我们相关的信息。
??????? Hive中连接查询和sql中的join连接几乎一致,共有四种:内连接、左外连接、右外连接、满外连接。
????????注意在MySQL中支持四种连接的语法,但是不支持满外连接的操作(满外连接的语法是支持的)。Hive都支持。
join语句的一般格式:
select 查询字段
from tableA
[inner|left|right|full] join tableB
on A\B 两个表的连接条件
where 筛选条件
group by 分组条件
having 分组筛选
order by 全局排序
limit 范围限制
一、内连接
?内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
案例:查询哪些部门有员工,并且显示每个部门员工的姓名
hive (default)> select e.empno, e.ename, d.deptno from emp as e inner join dept as d on e.deptno = d.deptno;
二、左外连接
左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。
案例:查询所有的员工信息以及员工对应的部门名字,如果员工没有对应部门,数据也保留。
hive (default)> select e.empno, e.ename, d.deptno from emp as e left join dept as d on e.deptno = d.deptno;
三、右外连接
右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返回。
案例:查询所有部门信息,并且将部门对应的员工信息也保留,如果部门没有员工,部门信息也保留
hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;
四、满外连接
满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。
案例:查询所有员工和部门信息,如果员工有部门则显示部门名,如果部门有员工就显示员工id和姓名;如果员工没有部门、部门没员工,显示NULL
hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;
五、笛卡尔乘积
join中有一个禁忌的join,叫做笛卡尔乘积,这种join属于一种致命的错误结果。
1、笛卡尔集会在下面条件下产生:
(1)省略连接条件(on)
(2)连接条件无效
(3)所有表中的所有行互相连接
2、案例实操
hive (default)> select empno, deptno from emp, dept;
FAILED: SemanticException Column deptno Found in more than One Tables/Subqueries
|