全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

sql连接查询语句中on、where筛选的区别总结

前言

相信对于每位程序员来说,sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,就能实现所有功能。 但是增删查改并不能代表sql语句的所有, 完整的sql功能会另人望而生畏。 就拿比普通增删查改稍微复杂一个层次的连接查询来说, 盲目使用, 也会出现意料之外的危险结果,导致程序出现莫名其妙的BUG。

在连接查询语法中,另人迷惑首当其冲的就要属on筛选和where筛选的区别了, 在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的让sql查询支持两种筛选器呢? 事实上, 这两种筛选器是存在差别的,只是如果不深挖不容易发现而已。

sql中的连接查询分为3种, cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的,极端一点,在编写这两种连接查询的时候,只用on不使用where也没有什么问题。因此,on筛选和where筛选的差别只是针对outer join,也就是平时最常使用的left join和right join。

下面话不多说,来一起看看详细的介绍:

来看一个示例,有两张数据表,结构和数据如图所示

表main

表ext

可以把这两张表看作是用来存放用户信息的, main放置主要信息,ext表放置附加信息,两张表的关系是1对1的,以id字符作为对应关系键。现在我们需要将地址不为杭州的所有用户信息筛选出来,结果中需要包含main表和ext表的所有字段数据。

select * from main left JOIN exton main.id = ext.id and address <> '杭州'

闭上眼睛, 请用大脑人肉运行一下这段SQL, 想象一下是什么结果。

当把address <> '杭州'这个筛选条件放在on之后,查询得到的结果似乎跟我们预料中的不同,从结果中能看出,这个筛选条件好像只过滤掉了ext表中对应的记录,而main表中的记录并没有被过滤掉,也就是上图中标记为红色的那条记录。outer join相对于inner join的一个主要特性就是以一侧的表为基础,但是在这里以左表为基这一点却可以无视筛选条件,这未免也太霸道了一些。

把查询语句稍微改动一下,将地址的筛选条件从on转移至where

select * from main left JOIN ext on main.id = ext.id where address <> '杭州'

结果就如我们预期的那样了

造成这种结果上的差异要从outer join查询的逻辑查询的各个阶段说起。

总的来说,outer join 的执行过程分为4步

      1、先对两个表执行交叉连接(笛卡尔积)

      2、应用on筛选器

      3、添加外部行

      4、应用where筛选器

就拿上面不使用where筛选器的sql来说,执行的整个详细过程如下

第一步,对两个表执行交叉连接,结果如下,这一步会产生36条记录(此图显示不全)

第二步,应用on筛选器。筛选器中有两个条件,main.id = ext.id and address<> '杭州',符合要求的记录如下

这似乎正是我们期望中查询的结果,然而在接下来的步骤中这个结果会被打乱

第三步,添加外部行。outer join有一个特点就是以一侧的表为基,假如另一侧的表没有符合on筛选条件的记录,则以null替代。在这次的查询中,这一步的作用就是将那条原本应该被过滤掉的记录给添加了回来

是不是不种画蛇添足的感觉, 结果就成了这样

第四步,应用where筛选器

在这条问题sql中,因为没有where筛选器,所以上一步的结果就是最终的结果了。

而对于那条地址筛选在where条件中的sql,这一步便起到了作用,将所有地址不属于杭州的记录筛选了出来

通过上面的讲解,已经能反应出在outer join中的筛选条件在on中和where中的区别,开发人员如能详细了解之中差别,能规避很多在编写sql过程中出现的莫名其妙的错误。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# sql  # on  # where  # 区别  # sql中on和where的区别  # 解析mysql left( right ) join使用on与where筛选的差异  # MySQL查询条件中放置on和where的区别分析  # 杭州  # 两张  # 那条  # 放在  # 笛卡尔  # 这两种  # 就拿  # 这一步  # 莫名其妙  # 过滤掉  # 有什么  # 是在  # 在这里  # 也会  # 就能  # 也没  # 画蛇添足  # 两种  # 只需  # 这段 


相关文章: 创业网站制作流程,创业网站可靠吗?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何通过服务器快速搭建网站?完整步骤解析  如何快速搭建自助建站会员专属系统?  如何在阿里云ECS服务器部署织梦CMS网站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站之星官网登录失败?如何快速解决?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  平台云上自助建站如何快速打造专业网站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  免费视频制作网站,更新又快又好的免费电影网站?  如何通过虚拟主机快速搭建个人网站?  建站之星在线版空间:自助建站+智能模板一键生成方案  寿县云建站:智能SEO优化与多行业模板快速上线指南  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  网站制作网站,深圳做网站哪家比较好?  安徽网站建设与外贸建站服务专业定制方案  如何在Windows虚拟主机上快速搭建网站?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  家具网站制作软件,家具厂怎么跑业务?  网站制作免费,什么网站能看正片电影?  html制作网站的步骤有哪些,iapp如何添加网页?  简单实现Android验证码  建站之星如何开启自定义404页面避免用户流失?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  Android滚轮选择时间控件使用详解  高防服务器:AI智能防御DDoS攻击与数据安全保障  建站之星导航菜单设置与功能模块配置全攻略  ,怎么用自己头像做动态表情包?  如何快速建站并高效导出源代码?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  如何快速搭建高效可靠的建站解决方案?  定制建站流程解析:需求评估与SEO优化功能开发指南  学校建站服务器如何选型才能满足性能需求?  如何在建站宝盒中设置产品搜索功能?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  建站之星如何实现PC+手机+微信网站五合一建站?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何快速使用云服务器搭建个人网站?  微课制作网站有哪些,微课网怎么进?  视频网站制作教程,怎么样制作优酷网的小视频?  高端建站如何打造兼具美学与转化的品牌官网?  香港服务器租用费用高吗?如何避免常见误区?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  大连网站设计制作招聘信息,大连投诉网站有哪些?  如何通过西部建站助手安装IIS服务器?  网站企业制作流程,用什么语言做企业网站比较好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。