图解sql中的where和on的区别

图解sql中的where和on的区别点击关注公众号 SQL 干货及时获取后台回复 1024 获取海量学习资源 SQL 刷题专栏 SQL145 题系列大家注意 因为微信改了推送机制 会有小伙伴刷不到当天的文章 一些比较实用的知识和信息 错过

大家好,欢迎来到IT知识分享网。


后台回复:1024,获取海量学习资源 SQL刷题专栏 SQL145题系列 大家注意: 因为微信改了推送机制,会有小伙伴刷不到当天的文章, 一些比较实用的知识和信息,错过了就是错过了。 所以建议大家加个星标,就能第一时间收到推送了。

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

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

测试样表

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

fa396ee5edc890084e6209dd3aa7c252.png

表Customers

b3593df346d3f212f2485955330da8df.png表Orders

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

SELECT a.*,b.订单ID FROM Customers a LEFT JOIN Orders b ON a.客户ID=b.客户ID  WHERE a.城市='广州'

7e3dd31e2706c2c682f33eb4c0e55a36.png

OK,我们的问题是:

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

这里要分情况来看:

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

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

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

11f52766c2fd21ac75939e83115dd371.png

VT-A1

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

4fe406d73f88ddbb7b0c41978c0562f1.png

VT-A2

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

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

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

SELECT a.*,b.订单ID FROM Customers a LEFT JOIN Orders b ON a.客户ID=b.客户ID AND a.城市='广州'

71c807a28eb33506005e5319964e5fa7.png

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

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

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

2fb0c8b1f5876a24f65d06a524f97e99.png

虚表VT-B1

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

666289ad2618ccba95f3f217b843da9d.png

虚表VT-B1-1

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

572ad87fa152b2ae868cb01fdf7ece8a.png

虚表VT-B2

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

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

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

SELECT a.*,b.订单ID FROM Customers a LEFT JOIN Orders b ON a.客户ID=b.客户ID

02363b57ad052233cdecd9cd7f8b76e3.png

虚表VT-C1

注意看:

461127351065c5e2f134a5a7f601c264.png

e0a3b2ac610b6724380a95b170ffc0ce.png

虚表VT-C2

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

结论

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


890ed58735e192cf98f6d109819d2f51.gif


最后给大家分享我写的SQL两件套:《SQL基础知识第二版》《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。

有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行

数据前线

32e905d05e32c4d75b18b54c66632a42.jpeg

后台回复关键字:1024,获取一份精心整理的技术干货 后台回复关键字:进群,带你进入高手如云的交流群



推荐阅读

文章有帮助的话,点赞,在看,转发吧。 谢谢支持 (*^__^*)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128144.html

(0)
上一篇 2025-09-02 19:33
下一篇 2025-09-02 20:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信