多表join时条件写在where和on的区别(总结篇)?

您所在的位置:网站首页 oracle中where和having的区别 多表join时条件写在where和on的区别(总结篇)?

多表join时条件写在where和on的区别(总结篇)?

2024-04-08 04:22| 来源: 网络整理| 查看: 265

在开发过程中经常遇到这种情况: 多表关联join时,到底限制的条件是写在where后面效率高还是写在on后面,又或者是先对表过滤使表的数据量减少,到底这三种效率哪种更高,看了一堆网上说的,都没有说到具体点上,现在对这三种情况专门做以下详细说明,你就会明白到底是怎么回事了?

干货总结:(以下只适用于left join,right join,full join,不适合inner join) 1、left join where + 基表过滤条件:先对基表执行过滤,然后进行left join; 2、left join where + 被关联表过滤条件:先执行left join,然后执行过滤条件; 3、left join on+基表过滤条件:满足过滤的left join,不满足的后面补null,然后两集合并一起; 4、left join on+被关联表过滤条件:先执行过滤条件,然后执行left join;

第一种情况: 在这里插入图片描述 这两种写法的执行顺序是一样的,都是先执行过滤,然后执行关联;所以运行效率是一样的!

第二种情况: 在这里插入图片描述 第一种执行顺序:先对a表进行过滤,再对过滤后的a表与b表进行关联 第二种执行顺序:先a表和b表进行关联,再对关联的结果执行where后面b表的条件

第三种情况: 在这里插入图片描述 第一种执行顺序是:

先对a表执行过滤条件, 然后过滤后的a表和b表进行关联;

第二种执行顺序:

先使用a.city='深圳'的过滤条件将a表分为两部分,一部分满足过滤条件,一部分不满足过滤条件, 对满足条件的与b表关联,不满足条件的后面字段补null,然后将满足和不满足的两部分集union起来成最后结果集;

第三种执行顺序:

先对b表进行b.city=‘上海’条件对b表进行过滤, 使用a.city='深圳'条件将a表分为满足和不满足条件的两部分集 对满足集合与过滤后的b表进行关联,不满足集后面字段直接补null,最后将两个集合union起来成最终结果集

以上都是经过查看执行计划并且经过具体测试得出的结论,所以针对不同的业务场景可以选择不同的写法来提高执行效率。

我相信有了上面几种情况的掌握,无论在怎么添加条件,都能很快的判断出代码的执行顺序!!!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3