数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
例如如下两张表:
A(aid int , aname char(10) )
B(aid int , aname char(10) )
对应数据:
执行语句: select * from a LEFT JOIN b on aid=bid
我的理解是, A左连接B , 先取A中的一条记录 , 根据on中的条件去匹配B表 , 如果能匹配就连接为一条新的记录 , 如截图中的第3行 ; 如果不能匹配 , 就把A的记录和字段值都是null的B记录连接, 如截图的1 和 2行 .
右连接类似: select * from a right JOIN b on aid=bid
可见 , 前面的两张连接中返回的记录中on的条件不一定为真 , 因为连接条件的字段有可能是null 值
而inner join : select * from a inner join b on aid =bid
则保证了on条件的成立.
所以在配合 left join/right join on 和 where 使用的时候 , 会有所区别:
例如 select * from a left join b on aid= bid and aid>3, 返回
如果是 select * from a left join b on aid= bid where aid>3
因为执行这种语句的时候 , 会生成临时表 , 这个临时表中的on 中的条件不一定为真, 因为有可能字段值是null ,
生成了临时表后就会根据where条件进行过滤, 所以返回的结果中where的条件一定会是真.
SQL: LEFT JOIN , RIGHT JOIN , INNER JOIN 区别 , on 和 where条件的区别
原文:http://www.cnblogs.com/coderbill/p/5831847.html