oracle/mysql操作与Hive不同时会特别标注
Hive的表连接
-等值连接
-不等值连接
-外连接
-自连接
等值连接/不等值连接:就看连接是不是用=
--等值连接
查询员工信息:员工号,姓名,月薪,部门名称
select e.empno,e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno;
--不等值连接:用>,<,between ..and等
查询员工信息:员工号,姓名,月薪,工资级别
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
外连接
外连接:左外连接/右外连接
左外连接:以左边表为准,当连接条件不成立时,左边的表包含在连接结果中
右外连接:以右表为准
--外连接:将连接中不成立的数据包含在连接结果中
如下面的deptno=40的数据
按部门统计员工人数:部门号,部门名称,人数
select d.deptno,d.name,count(e.empno)
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.name;
--注:HQL语句中没有包含在聚合函数中的都要放在group by的子句中
--解:上面的例子deptno=40的员工的信息未取出,因为dept表中有部门号为40,但是emp表中没有deptno=40员工的信息,而上面是等值连接。故只取两边都存在的部门号
#执行结果:
10.0 ACCOUNTING 3
20.0 RESEARCH 5
30.0 SALES 6
--用外连接,将40号的数据显示出。我们要显示deptno=40的数据,它是在dept表中,故以右边表为准,用右外连接
select d.deptno,d.name,count(e.empno)
from emp e right outer join dept d
on (e.deptno=d.deptno)
group by d.deptno,d.name;
#执行结果:
10.0 ACCOUNTING 3
20.0 RESEARCH 5
30.0 SALES 6
40.0 OPERATIONS 0
mysql/oracle/hive外连接的不同之处
相同之处:上面的左外/右外连接都可用left join/right join
不同之外:mysql/hive只能用left join/right join,而oracle除此之外还可以用“+”来实现。
oracle对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
#上面的右连接写成如下:
select d.deptno,d.name,count(e.empno)
from emp e,dept d
where e.deptno+=d.deptno
group by d.deptno,d.name;
--注意:用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接,以+另外一边表的数据为准
自连接
自连接:自己和自己连接,通过表的别名将同一张表视为多张表
查询员工的姓名和员工的老板姓名
注:员工的老板也是员工,也在员工表上,mgr是这列是指该员工的老板的员工号
select e.ename,b.ename
from emp e,emp b
where e.mgr=b.empno;