Outer Join和Inner Join的区别就在于未匹配行在结果集中的出现情况.
标准语法格式如下:
--left table -- LEFT --------------- JOIN -- right table -- ON -- join_condition
|_ RIGHT_||_ OUTER _|
|_ FULL _|
也就是说,
<1>outer有时候可以省略;
<2>对于外关联,只有on子句里面才是关联条件;
<3>A left join B等同于B right join A
在没有任何where子句的情况下,A left join B的结果集的记录数永远是
A表中的记录行数,这一点从维恩图中很容易就看出来.
外联结的操作性不象内联结那样可交换性, A left join B和B left join A
是完全不同的含义.所以大多数情况下,数据库的优化器通常会严格按照SQL
的代码书写顺序来依次进行Join操作. 在写多表外联结的时候就要
小心,保证最终出来的结果符合你的语义需求.
On子句的位置往往决定了Join的先后次序. 我只提供参考标准,
但很可能不同数据库的策略是不同的,所以大家有兴趣可以自己试试看看
实际的结果. (下面的举例都是在语句中不出现圆括号而改变优先级情况下)
<1>在SQL中的第一个On子句(自左向右)首先生效.
<2>任何一个On子句都作用于其最直接的前导Join操作
呃,是不是看不大明白? 那就来看例子吧.
(1) Table_A
left outer join Table_B on join_condition_1
right outer join Table_C on join_condition_2;
(2) Table_A
left outer join Table_B
right outer join Table_C
on join_condition_1
on join_condition_2;
这两个查询含义相同么?结果一样么? Of cause not
例子1 是 A先left join B (join_condition1),其结果再和
C right join (join_condidtion2)
例子2 是 B先和C right join(join_condition1) ,A再和
其结果进行left join(join_condition2)
嗯,下面这个例子,有兴趣的朋友自己分析一下join的次序吧
(3) Table_A
left outer join Table_B on join_condition_1
JOIN Table_C
right outer join Table_D on join_condition_2
on join_condition3;
所以,为了避免因为书写顺序的不同而导致的结果大相径庭,对于
多表联结,
<1>可以用()来显著地标明操作优先级;
<2>尽可能地每个outer join后面紧跟on子句,不要把所有on子句
堆叠到SQL的末尾;
ps 1.Join操作多表关联的数量在有些数据库是有限制的;