一、外连接

oracle 连接查询分为外链接和内连接,我们先看外连接【outer join】。oracle 的外连接查询分为:

  • 左外连接 (左边的表不加限制) left outer join
  • 右外连接 (右边的表不加限制) right outer join
  • 全外连接 (左右两表都不加限制)full outer join; 通常outer关键字可省略,写成:left/right/full join 即可。

在左右连接时,通常都会以一张表如A表为基础表,该表的内容会全部显示,再加上A表和B表匹配的内容。如果A表中的数据在B表中没有记录,那么会在结果集中以空值显示。

关于外连接,也可以使用(+)来表示。关于使用(+)的一些注意事项:

  1. (+)操作符只能出现在where子句中,且不能与 outer join 语句同时使用。
  2. 使用(+)操作符执行外连接时,如果where子句中存在有多个条件,则必须在所有条件中都包含(+)操作符。
  3. (+)操作符值适用于列,不能用在表达式上
  4. (+)操作符不能与OR和IN操作符一起使用
  5. (+)只能用于实现左外连接和右外连接,不能用于实现全外连接。

1.左外连接--left (outer) join

    左外连接是以左表为基础表,示例中以 emp 表为左表,显示所有的查询数据;以 dept 表为右表,显示与 emp 表匹配后的数据,即显示符合查询条件的数据。

select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e left join dept d on e.deptno=d.deptno;
或
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e left outer join dept d on e.deptno=d.deptno;

 

    用(+)操作符来实现。这个(+) 操作符可以这样理解: + 表示补充,即哪个表有+号,哪个表就是匹配表。如果 + 号写在右表,则左表就全部显示,所以为左连接。

  【(+):Oracle专用的联接符,在条件中出现在左边指右外联接,出现在右边指左外联接

select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e,dept d where e.deptno=d.deptno(+);

 

 

2.右外连接--right (outer) join

    右外连接与左外连接正好相反,它是以右表为基础表。在示例中,dept 表为右表,全部显示;emp 表为左表,显示符合查询条件的数据。emp表记录不足的地方显示为NULL。

select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e right join dept d on e.deptno=d.deptno;
或
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e right outer join dept d on e.deptno=d.deptno;

 

     用(+)操作符显示,即为:

select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e,dept d where e.deptno(+)=d.deptno;

 

  红线框中为dept表中有,而emp表中没有的数据,显示为NULL。

 

 

3.全外连接--(FULL OUTER JOIN/FULL JOIN

    全外连接对左表和右表都不做限制,所有的记录均显示,两表不足的地方都为NULL。全外连接不支持(+)写法

  

select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e full join dept d on e.deptno=d.deptno;
或
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e full outer join dept d on e.deptno=d.deptno;

 

 二、内连接

    内连接也叫简单连接,只返回满足条件的记录。用inner join......on.. 来标记,inner可省略。

select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e inner join dept d on e.deptno=d.deptno;
或
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e join dept d on e.deptno=d.deptno;

 

posted on 2018-01-08 17:33  透明的千纸鹤  阅读(3589)  评论(0编辑  收藏  举报