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‘);