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

Paste_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
执行结果是


Paste_Image.png

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

总结:
1、如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用
2、如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值