前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解sql中的where和on的区别

图解sql中的where和on的区别

作者头像
SQL数据库开发
发布2024-04-25 10:58:39
800
发布2024-04-25 10:58:39
举报
文章被收录于专栏:SQL数据库开发SQL数据库开发

经常会有读者有疑问,sql中关联条件是放where后面好,还是on后面好?今天就通过图形的方式给大家来解决这个问题。

之前两章我们通过图解SQL的执行顺序和JOIN的原理知道了这两步的执行过程。

在执行完ON筛选后,相关的虚表就会进入到WHERE阶段。

测试样表

我们新建两张测试表Customers和Orders,表结构如下:

表Customers

表Orders

要求:使用SQL查询广州客户的相关信息(客户ID,姓名,地址,城市,邮编,省份,订单ID)

我们直接写出正确的SQL查询语句:

代码语言:javascript
复制
SELECT a.*,b.订单ID FROM Customers a 
LEFT JOIN Orders b ON a.客户ID=b.客户ID 
WHERE a.城市='广州'

结果如下:

OK,我们的问题是:

既然ON和WHERE都是过滤筛选条件的,那么能不能将WHERE后面的条件 a.城市='广州' 放在 ON条件后面呢?

这里要分情况来看:

如果是内连接(inner join)是可以直接放ON后面的,与放在WHERE后面的效果是相同的。

我们还是以上一章的例题来讲解:

因为在sql的内连接阶段,左表(a)和右表(b)通过笛卡尔积生成的虚表VT-A1,

VT-A1

在经过内连接后会将虚表VT-A1中符合条件

(a.CustomerID=b.CustomerID)的左右表完成筛选,最后得到虚表VT-A2,如下图

VT-A2

这样就没有添加外部行的动作了,不管其它过滤条件是放在ON后面还是WHERE 后面,都只是对VT-A2进行进一步的过滤,ON和WHERE的效果没有任何差别。

但如果是左右连接则只能放在WHERE后面,这是为什么呢?

回到最开始的例题,我们可以先看下将 a.城市='广州' 条件放到 ON后面看下结果:

代码语言:javascript
复制
SELECT a.*,b.订单ID FROM Customers a 
LEFT JOIN Orders b ON a.客户ID=b.客户ID AND a.城市='广州'

结果为:

与你想的结果是不是完全不同?

这是因为在执行sql左连接的时候,是先执行的ON后面的所有条件。

从上述的代码我们可以知道,先将Customers表与Orders表的客户ID进行内连接,这个时候得到的是下面的这个虚表VT-B1的结果

虚表VT-B1

然后再接着加上了一个 and a.城市='广州' 这个条件,那么我们会对上面的这个虚表VT-B1进一步过滤,得到虚表 VT-B1-1

虚表VT-B1-1

执行完虚表VT-B1-1后,根据我们上一章的LEFT JOIN的原理,我们是要将左表(Customers表)未关联上的其它所有数据都要添加到虚表VT-B1-1中的,所以在执行完LEFT动作之后,它的结果变成了虚表VT-B2。

这个时候除了虚表VT-B1-1的订单ID非空,其它Customers表中被添加的数据行对应的订单ID均为空。

虚表VT-B2

即我们上述sql代码的错误结果。

那为什么 a.城市='广州' 放在WHERE后面结果又是正确的呢?

因为在LEFT JOIN结束后的阶段后:

代码语言:javascript
复制
SELECT a.*,b.订单ID FROM Customers a
LEFT JOIN Orders b ON a.客户ID=b.客户ID

我们得到的虚表VT-C1是如下这样的:

虚表VT-C1

注意看: 虚表VT-C1与上面错误结果虚表VT-B2的区别,上面的虚表VT-B2在订单ID列,只有城市为广州的非空,而VT-C1只要匹配上客户ID的订单ID均非空

而我们的WHERE条件 a.城市='广州' 就是对VT-C1进行筛选,得到如下虚表VT-C2

虚表VT-C2

因为是最后一步,所以sql的查询分析器会直接将VT-C2的结果返回给查询发起者,所以我们得到的最终正确结果就是虚表VT-C2.

在理解了LEFT JOIN,RIGHT JOIN和INNER JOIN的原理后,再来看WHERE和ON的区别就比较容易理解了。

结论

1、对于内连接(inner join),sql过滤条件放在where或者on后面没有区别

2、对于左右连接(left/right join),sql过滤条件放在where或者on后面有很大的区别。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-27,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 SQL数据库开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com