sql语句中left join、inner join中的on与where的区别

inner join(等值连接) 只返回两个表中联结字段相等的行


left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

 

 

table a(id, type):

 

id     type 

----------------------------------

1      1         

2      1          

3      2         

 

table b(id, class):

 

id    class 

---------------------------------

1      1

2      2

 

sql语句1:select a.*, b.* from a left join b on a.id = b.id and a.type = 1;

sql语句2:select a.*, b.* from a left join b on a.id = b.id where a.type = 1;

sql语句3:select a.*, b.* from a left join b on a.id = b.id and b.class = 1;

 

sql语句1的执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            2        2

3        2            null    null 

 

sql语句2的执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            2        2

 

sql语句3的执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1           null   null 

3        2           null   null 

 

由sql语句1可见,left join 中左表的全部记录将全部被查询显示,on 后面的条件对它不起作用,
 left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.

除非再后面再加上where来进行筛选,这就是sql语句2了;

由sql语句3可见,on后面的条件中,右表的限制条件将会起作用。

*以上可以看出 通过jion on 的特性 可以替换Not in

如:select * from a where id not in (select id from b)

可优化成: select * from a join b on a.id = b.id where b.id is null

 

**********************************************************************************

sql语句4:select a.*, b.* from a inner join b on a.id = b.id and a.type = 1;

sql语句5:select a.*, b.* from a inner join b on a.id = b.id where a.type = 1;

sql语句6:select a.*, b.* from a, b where a.id = b.id and a.type = 1;

sql语句7:select a.*, b.* from a, b where a.type = 1 and a.id = b.id;

 

这四条语句的执行结果一样,如下:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            2        2

 

由此可见,inner join 中on后面的限制条件将全部起作用,这与where的执行结果是一样的。另外,where语句与inner join确实能得到相同的结果,只是效率不同(这个我没有测试过,不过我相信这个结论)。

 

 

 

posted @ 2010-04-06 15:24  eastday  阅读(1266)  评论(0)    收藏  举报