多表连接查询

多表连接查询:
1.交叉连接(笛卡尔积):所有情况的组合 ,不推荐使用
select * from emp ,dept ;


2.内连接 :多张表通过 相同字段进行匹配,只显示匹配成功的数据
a.
select * from emp e ,dept d
where e.deptno = d.deptno ;
b.
select * from emp e
inner join dept d
on e.deptno = d.deptno
不等值连接(一般不用)
select * from emp e ,dept d
where e.deptno <= d.deptno ;

3.外连接
左外连接:以左表为基准(左表数据全部显示),去匹配右表数据,如果匹配成功 则全部显示;匹配不成功,显示部分(无数据部分 用NULL填充)
a.(oracle独有)
select * from emp e ,dept d
where e.deptno = d.deptno(+) ;


b
select * from emp e
left outer join dept d
on e.deptno = d.deptno


右外连接
右外连接:以右表为基准(右表数据全部显示),去匹配左表数据,如果匹配成功 则全部显示;匹配不成功,显示部分(无数据部分 用NULL填充)
a.(oracle独有)
select * from emp e ,dept d
where e.deptno(+) = d.deptno;


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


全外连接 = 左外 + 右外连接 - 去重


自连接:将一张表 通过别名 “视为”不同的表


查询 员工姓名,以及 该员工的领导姓名
select e.ename ,b.ename from emp e,emp b
where e.mgr =b.empno;
//员工表的领导编号mgr = 领导表的 员工编号号empno


自连接 比较费性能: emp -> e,b

优化?
层次连接:
select level ,empno, ename ,mgr from emp
connect by prior empno=mgr
start with mgr is null
order by level ;

原文地址:https://www.cnblogs.com/mayouyou/p/13198674.html