部分转载:https://www.cnblogs.com/zsq23837880/p/7040923.html

前两天面试,遇到了一道题。说的是LEFT JOIN关联表中ON,WHERE后面跟条件的区别。

当时确实有点懵逼~经常做这种left join,inner join连接,却发现居然只是模糊的认识。

回到家后,马上开启了“实践是检验真理的唯一标准”模式。

三下五除二,建了两张表尝试起来。

首先是Person表,数据如下:

City表,数据如下:

既然是面试题是left join,那咱就试试。

从上述结果知道, left join会将左表的所有记录都显示出来,而在右表不匹配on条件的数据行则该列显示为Null。

而where条件由于在left join之外,所以是对连接之后的结果再次过滤。

那这是为什么呢??

因为数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回。

在使用left join时,on和where条件的区别如下:1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录;2、where条件是在临时表生成好后,再对临时表进行过滤的条件;

注意: left join 或 right join时,如果条件写在where后,是不是感觉相当于inner join,但是要注意以下情况:
就是查询在a表中存在,但是b表不存在的数据; 正确语法如下: select * from a left join b on
a.bId = b.id where b.id is null ; 此时 写在where后,并不相当于inner join;
这时,条件也必须写在where后,而不能写在on后面。(使用上面结论即可分析出来) 因为:写在on后面,会查询b表为空,然后a
left b,相当于a left null,相当于没有lett, 这时会返回a表所有数据,而where则会对临时表结果进行过滤,此时,才是正确结果。

这下终于“真像大白(●—●)”了。

但是,作为一个举一反三的程序猿,怎能就这样草草了事。

既然left join是这个结果,那就刨根问底,inner join又是咋回事呢。

通过这个例子,我们可以看到,使用on c.country='CHN’和where c.country='CHN’的结果是一样滴。

但是过程却不一样。

inner join具有left和right的特性的交集,需要两个表中的数据都符合on条件,才能被筛选出来。

到这里,我们就明白了on和where之间的区别。

总结:

在使用join时,on和where后面跟条件的区别如下:1、写在on后面,会将join后的内容(包括on以及and)看做一个整体,即:join后面一直到下一个join或者where前面都是在描述'一个表';
然后再同join之前的表进行inner或left或其他关联;**简单理解:**on后面的统统作为连接的条件,符合on后面所有条件的才连接。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。

把条件写在 join on 后面和写到where后面的区别相关推荐

  1. 在带有OR条件的LEFT JOIN中使用索引(Using index in LEFT JOIN with OR condition)

    在带有OR条件的LEFT JOIN中使用索引(Using index in LEFT JOIN with OR condition)

  2. 手写数字识别案例、手写数字图片处理

    python_手写数字识别案例.手写数字图片处理 1.手写数字识别案例 步骤: 收集数据 带有标签的训练数据集来源于trainingDigits文件夹里面所有的文件,接近2000个文件,每个文件中有3 ...

  3. 写乐100道练习题_写乐大型21K详细评测(文长慎入)

    本帖最后由 预应力钢笔尖 于 2012-6-9 19:06 编辑 过了两天了,让我对刚入手的写乐21K做一个简单的评测. 在之前的帖子当中提到过,我最开始就是因为看了黄瓜兄的"低端横向对比& ...

  4. 脏写、脏读、不可重复读、幻读的区别

    一般对于我们的业务系统去访问数据库而言,它往往是多个线程并发执行多个事务的,对于数据库而言,它会有多个事务同时执行,可能这多个事务还会同时更新和查询同一条数据,所以这里会有一些问题需要数据库来解决 我 ...

  5. python笔记手写照片_用Python对手写笔记进行压缩与增强

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 我写了一个程序来清洁手写笔记的扫描图,并同时减少文件大小. 示例输入输出: 左边: 300 DPI, 7. ...

  6. 学计算机的普遍字写得都不好,国人普遍写不好汉字的原因探析

    汉字是我们进行交际的重要工具,写好规范汉字是国人应该具备的一项基本技能.书写规范得体的汉字,即能够准确地记载和传递信息,还能给阅读者创造一个情趣别致的审美意境.昔日,书写一手漂亮的汉字是令人羡慕的特长 ...

  7. 学计算机怎么写能力,计算机专业能力怎么写

    类似问题答案 计算机专业怎么写 那就运用熟练了,然后写熟练运用PS.CAD.OFFICE等应用软件,能够独立进行网页设计..... 非计算机专业毕业生在个人简历上,计算机水平,怎么写 计算机水平:计算 ...

  8. inner join 和 left join 限制条件放在 where 和 on 后面 有什么区别?

    1.inner join 和 left join 限制条件放在 where 和 on 后面 有什么区别? 先说结论: 用 inner join , LEFTJOIN时,条件直接放ON后面,是先筛选后连 ...

  9. 先写API文档还是先写代码?你需要这款神器Apifox!

    代码未动,文档先行 其实大家都知道 API 文档先行的重要性,但是在实践过程中往往会遇到很多困难. 程序员最讨厌的两件事:1. 写文档,2. 别人不写文档.大多数开发人员不愿意写 API 文档的原因是 ...

最新文章

  1. WINKEY功能键你会用吗??
  2. QT的QNetworkDiskCache类的使用
  3. 演示:EIGRP非等价负载均衡(故障分析与解决篇)
  4. 入门前端学习路线图【送书】
  5. Eclipse Qt开发环境的建立【转】
  6. Centos7 升级稳定版 openssl
  7. android 获取程序名,Android_Android获取应用程序名称(ApplicationName)示例,MainActivity如下: 复制代码 代码 - phpStudy...
  8. TypeScript学习笔记(七):模块
  9. paip.提升用户检验-----列表摘要
  10. python面试通关_Python面试通关宝典
  11. Python绘图Turtle库详解
  12. 技术架构图-大数据架构
  13. 服务器频繁重启怎么解决
  14. win10系统安装+激活+去水印
  15. 信息安全与密码学概论
  16. 英文期刊催稿信模板_英文投稿,询问进展,催稿 模版信
  17. 显卡,就是一个男人对自己的交待
  18. html如何查看字体样式,css2.0文档查阅及字体样式
  19. 南京建邺、秦淮等7个区公布校外培训机构白名单
  20. 前端如何优雅的实现跨终端开发(PC端+移动端)

热门文章

  1. 又一大佬离职?天猫淘宝搞拆分~
  2. 日本诺奖候选科学家加盟中国双非院校,网友热议:日本科学亡矣?
  3. 【LeetCode】1732.找到最高海拔
  4. 机票预订系统完整数据字典
  5. 吃鸡游戏计算机配置,畅玩主流游戏吃鸡LOL组装电脑配置清单
  6. Thymeleaf中文文档
  7. Improving Transferability of Adversarial Examples with Input Diversity
  8. Unity 报错之 InvalidProgramException: Invalid IL code in CC_Ctrl:getFixByPlatForm ():IL_0008: ldc.i4.5
  9. linux复制虚拟机网卡无法使用及新增网卡不被识别问题解决
  10. javascript练习20:长度单位换算(计算精度待解决版)