借用了一个博友:http://blog.csdn.net/tomholmes7/article/details/5786166
建立表结构如下:
create table a (a1 int, a2 varchar(10)); create table b (b1 int, b2 varchar(10)); create table c (c1 int, c2 varchar(10)); insert into a values( 1 ,'haha'); insert into a values( 2 ,'ssss'); insert into a values( 4 ,'tttt'); insert into b values( 1 ,'cccc'); insert into c values( 2 ,'xxxx'); 执行下面的两条left join: select * from a left join b on a.a1=b.b1 left join c on a.a1=c.c1; select * from a left join b on a.a1=b.b1 left join c on b.b1=c.c1; 实际上结果是不同的: 前者是: 后者是:个人理解:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地方均为NULL。
当left join c的时候,是以a left join b生成的临时表为主表然后去left join c表,我是这么理解的。
a left join b on a.a1=b.b1 left join c on a.a1=c.c1 => 一环扣一环,基本上不会出现问题