sql join 的on 和 where 区别

essay文章表跟essay_comment评论表的关联是 essay.id=essay_comment.essay_id

SELECT e.id, e.app_id, e.deleted ,ec . * 
FROM  `essay` e
LEFT JOIN  `essay_comment` ec ON e.id = ec.essay_id
and e.deleted=0
WHERE app_id =  11016
ORDER BY `e`.`deleted`  ASC
LIMIT 0 , 30
image.png

这个是essay 左连接left join essay_comment,这就意味着左边的表只要跟右边的表联立的条件(e.id=ec.essay_id)成立,就无论如何左边的表记录都会出现,哪怕其他条件 (e.deleted =0 被删除的文章) 不成立,都会出现,就是说,这个e.deleted=0在on里面限制不了essay。参考上图的deleted字段,证明on里面的e.deleted=0没有生效,deleted=1的essay照样出现了。 这里要注意的是,on里面的条件是是必须都匹配才能使右边的表记录出来,否则就算deleted=1的essay出来了,但是它不同时符合e.deleted=0 and e.id=ec.essay_id,这就会使右边的表记录字段时都null。

所以当上面sql 去掉on里面的e.deleted=0
执行结果是

image.png

id=222的essay本来被删除的,现在对应的评论也出来了

总结:

  1. 如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用
  2. 如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用
  3. 如果SQL用的是Inner Join (也可以缩写成Join),On的条件对两个表都起作用。

参考 http://hfcombo.blog.51cto.com/9089438/1613342

http://m.studyofnet.com/news/434.html
http://blog.csdn.net/melody_mr/article/details/48596445