首先仍是声名一下,为什么要使用毗连(join)?原因有两点:3 V) L% v5 y! ]/ [. R" T- N, T! ^7 `
1)经常有需要访谒多个表中字段的情形& V1 J: @, c4 u+ C7 P ]9 p0 l, Z
2)用子发芽也可以实现膳缦沔的功能,可是效率相当低下。使用毗连可以年夜年夜提高效率。- }$ P( I) Q; K# c: m) C% l2 Z% V
毗连(Join)的根基结构:
& v; U/ ?* b, B+ |8 t b, ? select ... from table1 t1 join table2 t2 on ti.id = t2.id;2 B8 @, E. U' b5 [5 _
join前后是两个需要毗连的表,on暗示的昵喱接的前提。传统的写法是不使用join关头字,使用where暗示前提:! P7 u: Y+ b& ?1 U( r. k
select ... from table1 t1, table2 t2 where ti.id = t2.id;
7 @4 {) c, v8 [: ? 一般是两个表进行毗连,三个表的毗连语法稍有分歧:/ z/ v) |! \) N/ Y2 ~
通俗写法:select ... from a join b on a.id = b.id/ L" @& B, {, n k
join c on b.id = c.id;
9 L9 B, G4 }* Z6 c 传统写法:select ... from a, b, c where a.id = b.id and b.id = c.id;7 b0 y7 }- J, v' Z3 l5 ^
1,对等毗连
: w1 a* e7 P4 Q5 u: ~& c 膳缦沔的就是一种对等毗连,即默认的join体例。特点是只显示毗连的表中存在而且相等的记实。其它的记实均不显示。
( F2 j3 C) b1 l; W' r8 u 传统的写法也是一种对等毗连,只显示匹配前提的记实。& o3 `% {1 l- r5 J
2,左/右毗连
5 J% G7 Z r. Q) y, u 有时需要将进行毗连的其一一个表作为基准显示全数的数据,按照毗连前提在其它表中可能会呈现无法匹配的数据,此时就用空值来庖代。好比显示员工信息时,有的员工可能还没有分配到某个具体的部门(新进员工),其所属部门一项就没稀有据,可是员工仍然需要显示,即员工表数据需要全数显示。
) P& R: r# G9 d. t0 z8 W 具体语法:1 K4 [, r6 U* U+ F5 T& u
select ... from table1 t1 left join table2 t2 on ti.id = t2.id; --左毗连( _3 S4 p/ n( y& M4 ^) d/ Y1 P
或
3 m, l. B4 r& ~5 w' T. D8 u select ... from table1 t1 right join table2 t2 on ti.id = t2.id; --右毗连
2 v' ]+ M% L3 H# V/ ~3 N 左仍是右的区别,简单地说左(右)毗连就是指join的左(右)边是基准表,全数数据都要显示,按照毗连前提无法进行毗连的记实就用空值庖代。. z9 A+ C+ W4 f# t
好比:
; ^& X: D6 D* X; @! p5 n% \ select e.empno, e.ename, d.dname from emp e left join dept d on e.deptno = d.deptno;# |/ U3 {' N* E; q3 c2 L/ E/ E7 {
还没有分配到某个具体的部门的员工的e.deptno必定是没有值的,无法知足“e.deptno = d.deptno”的前提,但因为是左毗连,左边的员工表的数据必然会显示,这时该员工的部门名称就是空值。
( M; v! f6 u! V! N
- i! o0 P, b0 I 若是right join ... on,就暗示部门表的数据全数显示,员工表中无法毗连的数据就是空值庖代,意思就是嗣魅这个部门还没有员工,因为在员工表中没有一标识表记标帜录的deptno与该部门的deptno相匹配(可能是刚刚成立的新部门) |