oracle 多表查询

1、等值连接:取关系列相同的记录
select * from emp e,dept d where e.deptno=d.deptno;
查出emp、dept表中deptno列相同的记录

2、非等值连接:取关系列不相同的记录
select * from emp e,dept d where e.deptno>d.deptno;
查出emp表中deptno大于dept表中的记录
3、外连接:左左外连接以左表为主,右外连接以右表为主
右连接,以右表为主,右表所有记录多查询出来,左表只查出复合条件的记录
select * from emp e,dept d where e.deptno(+)=d.deptno;
select * from emp e right outer join dept d on e.deptno=d.deptno;

左连接,以左表为主,左表所有记录多查询出来,右表只查出复合条件的记录
select * from emp e,dept d where e.deptno=d.deptno(+);
select * from emp e left outer join dept d on e.deptno=d.deptno;

全连接 ,所有记录来自于两张表,用null值来匹配缺失值
select * from emp e full join dept d on e.deptno=d.deptno;

4、自连接:特殊等值连接,取同一张表不同角度看待的记录
select e1.ename || ' 领导是' || e2.ename from emp e1, emp e2 where e1.mgr = e2.empno;

5、交叉连接产生一个笛卡尔积 cross join
笛卡尔积:多表查询时,查询记录的行数等于所有表行数的乘积,列数等于所有表列数之和
select * from emp ,dept;
select * from emp cross join dept;

6、自然连接 natural join (注)所有相同列等值连接
natural join 子句是基于两个表中列名完全相同的列产生连接,查询连接列的值相等的记录,不保留重复的属性。
natural join 子句中的列不能使用表别名做前缀。如:e.deptno='10' 或 d.deptno='10'

查出两表中相同列值相同的记录
select * from emp e natural join dept d;

查出两表中指定列值相同的记录
select * from emp e natural join dept d where deptno='10';

7、using(X)创建连接
using子句引用的列在sql任何地方都不能使用表名或别名做前缀

查出两表中相同列值相同的记录
select * from emp e join dept d using(deptno);

查出两表中指定列值相同的记录
select * from emp e join dept d using(deptno) where deptno='30';

8、join on 创建连接 ,不同于自然连接,使用join on 可以指定连接列和设置任意的连接条件

select * from emp e join dept d on e.deptno=d.deptno where e.deptno='10';

join on 可以进行两张以上的表连接查询
select * from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.hisal where e.deptno='10';

原文地址:https://www.cnblogs.com/dyfbk/p/7649581.html