Oracle中多表查询

--多表查询中的一些概念
--笛卡尔积(意义不大)
--(两张表的数据量相乘)
--(就是一张表中所有的纪录一一和另一张表中所有的记录作匹配)
select * 
from emp e, dept d;

EMP表有14条数据,DEPT表有4条数据
在这里插入图片描述

--等值连接
select *
from emp e,dept d
where e.deptno=d.deptno;

在这里插入图片描述

--内连接
select *
from emp e inner join dept d
on e.deptno=d.deptno;

跟上面的等值连接一样在这里插入图片描述

–查询出所有部门,以及部门下的员工信息。【外连接】
–至于是左外连接还是右外连接就是两张表换换位置而已,统称为外连接
–left join是显示的左侧表的全部数据,right join相反

select * 
from emp e right join dept d
on e.deptno=d.deptno;

其中有一个部门没人在这里插入图片描述

--查询所有员工信息,以及员工所属部门
select * 
from emp e left join dept d
on e.deptno=d.deptno;

查出结果和内连接一样,主要是因为每个员工都有自己的所属部门,假如有个员工没有所属部门,那么此时这个左外连接查询就会比内连接多一条数据,因为上面的内连接查出来的都是有所属部门的员工,✌耶!
在这里插入图片描述

=============================
这个相当于上面的右外连接

--oracle中专用外连接
select * 
from emp e , dept d
where e.deptno(+)=d.deptno;

看结果
在这里插入图片描述

select * 
from emp e , dept d
where e.deptno=d.deptno(+);

这个相当于上面的左外连接
在这里插入图片描述

--查询出员工姓名,员工领导姓名
--自连接:自连接其实是站在不同的角度把一张表看成多张表
select e1.ename,e2.ename
from emp e1,emp e2
where e1.mgr=e2.empno;

在这里插入图片描述

--查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称
select e1.ename,d1.dname,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2
where e1.mgr=e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno;

在这里插入图片描述

--查询出员工姓名,员工部门名称,员工工资等级,
--员工领导姓名,员工领导部门名称,领导工资等级
select e1.ename,d1.dname,s1.grade,e2.ename,d2.dname,s2.grade
from emp e1,emp e2,dept d1,dept d2,salgrade s1,salgrade s2
where e1.mgr=e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno
and e1.sal between s1.losal and s1.hisal
and e2.sal between s2.losal and s2.hisal;

在这里插入图片描述

--查询出员工姓名,员工部门名称,员工工资等级,
--员工领导姓名,员工领导部门名称,领导工资等级
select e1.ename,d1.dname,
decode(s1.grade,
1,'一级',
2,'二级',
3,'三级',
4,'四级',
5,'五级')grade,
e2.ename,d2.dname,
decode(s2.grade,
1,'一级',
2,'二级',
3,'三级',
4,'四级',
5,'五级')grade
from emp e1,emp e2,dept d1,dept d2,salgrade s1,salgrade s2
where e1.mgr=e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno
and e1.sal between s1.losal and s1.hisal
and e2.sal between s2.losal and s2.hisal;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34721292/article/details/90552577