6.4 join
语句
6.4.1 等值连接
Hive 只支持等值连接, 不支持普通的 SQL 的非等值连接.
根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门编号;
select e.empno, e.ename, d.deptno, d.dname from emp e join dept d
on e.deptno = d.deptno;
说明:
e
是表的别名.- 使用别名可以简化查询。
- 使用表名前缀可以提高执行效率。
6.4.2 内连接
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。6.4.2
前面的等值连接也是内连接
6.4.3 左外连接
返回左表的所有行和满足连接条件的行.
即使右表没有匹配的记录, 也会返回左表中所有的行, 右表没有匹配的记录, 则用 NULL
来代替
select e.empno, e.ename, d.deptno, d.dname
from emp e left join dept d
on e.deptno=d.deptno;
6.4.4 右外连接
返回右表的所有行和满足连接条件的行.
即使左表没有匹配的记录, 也会返回右表中所, 左表没有匹配的记录, 则用 NULL
来代替
6.4.5 满外连接
返回两张表中所有的记录, 如另外一张表没有匹配的, 则用 NULL
替换.
6.4.6 多表连接
注意:连接 n
个表,至少需要 n-1
个连接条件。
例如:连接三个表,至少需要两个连接条件。
再创建一张表location
:
数据:
创建表:
create table if not exists default.location(
loc int,
loc_name string
)
row format delimited fields terminated by '\t';
导入数据:
load data local inpath '/opt/module/datas/location.txt' into table default.location;
多表连接查询:
e.ename, d.deptno, l. loc_name
FROM emp e
JOIN dept d
ON d.deptno = e.deptno
JOIN location l
ON d.loc = l.loc;
说明: 大多数情况下,Hive 会对每对 JOIN 连接对象启动一个 MapReduce 任务。 本例中会首先启动一个 MapReduce job 对表 e 和表 d 进行连接操作, 然后会再启动一个 MapReduce job 将第一个 MapReduce job 的输出和表 l ;进行连接操作。 注意:为什么不是表d和表l先进行连接操作呢?这是因为Hive总是按照从左到右的顺序执行的。