SQL中on&where的区别

写在前面

今天看见群里有小伙伴在问sql中on&where有啥区别,似乎都能实现过滤数据的效果,但又感觉又不太一样,始终有点理不清。这不,
在这里插入图片描述
这里简单记录下我的理解。如果有误,欢迎指正~笔芯

结论就是:
1.on先过滤数据再进行表的连接,where先连表得到临时查询结果 最后再对结果进行过滤
2.on 后面的过滤条件只会影响当前表的行数,而如果把这个从表的筛选条件 放在了where里面,这样就会影响主表的返回行数

所以,也是比较多的场景是:拿left join 举例,如果你需要返回左表的全部数据,这样的话,你就不能把从表的筛选条件放到where里面,只能放在自己的on后面先过滤

还有一种场景就是:把主表的筛选条件放置到on后面,这样得到的结果 == 等价 == 将主表筛选条件放到where里面了
但是这样的是性能应该是会高一些,因为上面说到,on会先过滤数据再连表。其实这里是有一个谓词下推的概念。

谓词下推

简单来说就是,就是在 TableScan 每一行数据的时候,判断这行数据是否是 需要 的数据。尽早的进行过滤掉,减少IO的量(从而降低磁盘IO,网络IO,分区间数据移动,节点之间数据移动的IO等)。

再简单提一下:要提升IO效率:1.减少IO次数 2.减少IO量

猜你喜欢

转载自blog.csdn.net/liuge36/article/details/118539115