多标联查-外连接

3)外连接
  等值连接,需要两个表的关联字段等值才将结果返回。
如果需要将某一个表记录全部返回,即使另一个表找不到
对等字段记录,此时可以使用外连接。
  *a.左外连接
 
  ----使用LEFT OUTER JOIN...ON...语法------
  select e.ename,e.sal,e.deptno,d.dname
  from emp e left outer join dept d
     on(e.deptno=d.deptno);
   
 A left outer join B on(...)
 以A表记录显示为主,B表记录为补充.
当A表记录在B表找不到对等记录时,B以NULL方式补充。
 
  b.右外连接
 select e.ename,e.sal,e.deptno,d.dname
  from emp e right outer join dept d
     on(e.deptno=d.deptno);
 上面语句是以dept表显示为主,emp为补充.如果emp没有
对等记录,字段值以NULL补充。
 
select * from ja
 right outer join jb on(ja.id=jb.id);
等价于
select * from jb
 left outer join ja on(ja.id=jb.id)
 
----在JOIN...ON之前的外连接写法--------
//(+)所在表为补充表,另一方是主表
select * from ja,jb
where ja.id(+)=jb.id; //jb为主,ja为补充
 
  c.全外连接
   全外连接=左外连接+右外链接-(重复记录)
  select * from ja
    full outer join jb on(ja.id=jb.id);
 
 //查询部门编号,部门名称,部门员工人数
  select d.deptno,
         d.dname,
         count(e.ename) num
  from DEPT d left outer join EMP e
    on(d.deptno=e.deptno)
  group by d.deptno,d.dname
  order by d.deptno;
 
 
EMPNO ENAME DEPTNO DNAME
... ... 10 ...
NULL NULL 40 ...
NULL NULL 50 ...
//按部门分组统计,count(*)和count(ename)的区别
count(*) = 1
count(ename) = 0
 
//查询部门在NEW YORK和CHICAGO的员工编号和员工名称
select e.empno,e.ename
from DEPT d join EMP e on(d.deptno=e.deptno)
where d.loc in ('NEW YORK','CHICAGO');
posted @ 2016-05-16 11:43  YunMan  阅读(152)  评论(0编辑  收藏  举报