欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 2012年Oracle辅导:全面了解Oracle的连接 首先仍是声名一下,为什么要使用毗连(join)?原因有两点: 1)经常有需要访谒多个表中字段的情形 2)用子发芽也可以实现膳缦沔的功能,可是效率相当低下
欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入
2012年Oracle辅导:全面了解Oracle的连接
首先仍是声名一下,为什么要使用毗连(join)?原因有两点:
1)经常有需要访谒多个表中字段的情形
2)用子发芽也可以实现膳缦沔的功能,可是效率相当低下。使用毗连可以年夜年夜提高效率。
毗连(Join)的根基结构:
select ……。 from table1 t1 join table2 t2 on ti.id = t2.id;
join前后是两个需要毗连的表,on暗示的昵喱接的前提。传统的写法是不使用join关头字,使用where暗示前提:
select ……。 from table1 t1, table2 t2 where ti.id = t2.id;
一般是两个表进行毗连,三个表的毗连语法稍有分歧:
通俗写法:select ……。 from a join b on a.id = b.id
join c on b.id = c.id;
传统写法:select ……。 from a, b, c where a.id = b.id and b.id = c.id;
1,对等毗连
膳缦沔的就是一种对等毗连,即默认的join体例。特点是只显示毗连的表中存在而且相等的记实。其它的记实均不显示。
传统的写法也是一种对等毗连,只显示匹配前提的记实。
2,左/右毗连
有时需要将进行毗连的其一一个表作为基准显示全数的数据,按照毗连前提在其它表中可能会呈现无法匹配的数据,此时就用空值来庖代。好比显示员工信息时,有的员工可能还没有分配到某个具体的部门(新进员工),其所属部门一项就没稀有据,可是员工仍然需要显示,即员工表数据需要全数显示。
具体语法:
select ……。 from table1 t1 left join table2 t2 on ti.id = t2.id; --左毗连
或
select ……。 from table1 t1 right join table2 t2 on ti.id = t2.id; --右毗连
左仍是右的区别,简单地说左(右)毗连就是指join的左(右)边是基准表,全数数据都要显示,按照毗连前提无法进行毗连的记实就用空值庖代。
好比:
select e.empno, e.ename, d.dname from emp e left join dept d on e.deptno = d.deptno;
还没有分配到某个具体的部门的员工的e.deptno必定是没有值的,无法知足“e.deptno = d.deptno”的前提,但因为是左毗连,左边的员工表的数据必然会显示,这时该员工的部门名称就是空值。
若是right join ……。 on,就暗示部门表的数据全数显示,员工表中无法毗连的数据就是空值庖代,意思就是嗣魅这个部门还没有员工,因为在员工表中没有一标识表记标帜录的deptno与该部门的deptno相匹配(可能是刚刚成立的新部门)
3,全毗连
简单说就是摆布毗连的全数暗示,按照毗连前提在肆意一方表中呈现无法匹配的情形,不知足前提的部门均用空值庖代。
具体语法:
select ……。 from table1 t1 full join table2 t2 on ti.id = t2.id;
用2中例子来说,可能有时辰需要把整个公司的员工和部门信息做一个总览,可以对员工表和部门表做一个全毗连:
select e.empno, e.ename, d.dname from emp e full join dept d on e.deptno = d.deptno;
就可以知道员工所属的部门以及部门下面的员工,那些新进员工和刚刚成立的新部门也灰庠示在此鱿脯也就是结不美观中有空值的部门。
但需要注重的是,全毗连的效率斗劲低,凡是不举荐使用。
PS:
在Oracle中,对于左/右毗连和全毗连还有一种非凡的暗示体例,使用“(+)”符号,例如:
select ……。 from table1 t1, table2 t2 where ti.id = t2.id(+); --左毗连
select ……。 from table1 t1, table2 t2 where ti.id(+) = t2.id; --右毗连
select ……。 from table1 t1, table2 t2 where ti.id(+) = t2.id(+); --全毗连
4,自然毗连
这是Oracle的一种特有的毗连体例。它自动毗连两个表中数据类型和名称不异的字段,然后按照前提自动地将他们毗连起来。
具体语法:
select ……。 from table1 t1 left natural join table2 t2;
好比:
select emp.ename, dept.dname from emp natural join dept;
这里并没有指定毗连的前提,现实上oracle自动的将员工表中的deptno和部门表中的deptno做了毗连。
也就是现实上相当于:
select emp.ename,dept.dname from emp join dept on emp.deptno = dept.deptno;
因为这两张表的这两个字段deptno的类型和个名称完全不异。所以使用natural join时被自然的毗连在一路了。
PS:
如不美观自然毗连的两个表仅是字段名称不异,但数据类型分歧,那么将会返回一个错误。