1.交叉连接(笛卡尔积)
所有情况的组合(n*n),不推荐使用
select * from emp ,dept;
2.内连接
多张表通过相同字段进行匹配,只显示匹配成功的数据
a.(oracle独有)
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
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
4.右外连接
右外连接:以右表为基准(右表数据全部显示),去匹配左表数据,如果匹配成功,则全部显示,匹配不成功,显示部分(无数据部分,用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
5.不等值连接
一般不使用
select * from emp e ,dept d
where e.deptno <= d.deptno ;
6.全外连接
全外连接=左外连接+右外连接-去重
7.自连接
将一张表,通过别名"视为"不同的表
查询员工姓名,以及该员工的领导姓名
select e.ename ,b.ename from emp e,emp b
where e.mgr =b.empno;
//员工表的领导编号mgr = 领导表的 员工编号号empno
自连接比较费性能,因为是交叉连接的形式
对于自连接的优化
层次连接:
select level ,empno, ename ,mgr from emp
connect by prior empno=mgr
start with 当前节点的上层节点值=x
start with mgr is null
order by level ;
SQL> select level ,empno, ename ,mgr from emp connect by prior empno=mgr
2 start with mgr is null order by level ;
LEVEL EMPNO ENAME MGR
---------- ---------- -------------------- ----------
1 7839 KING
2 7566 JONES 7839
2 7698 BLAKE 7839
2 7782 CLARK 7839
3 7902 FORD 7566
3 7521 WARD 7698
3 7900 JAMES 7698
3 7934 MILLER 7782
3 7499 ALLEN 7698
3 7788 SCOTT 7566
3 7654 MARTIN 7698
LEVEL EMPNO ENAME MGR
---------- ---------- -------------------- ----------
3 7844 TURNER 7698
4 7876 ADAMS 7788
4 7369 SMITH 7902