多表关联查询过滤条件写在on与where后的区别 您所在的位置:网站首页 关联查询和子查询效率 多表关联查询过滤条件写在on与where后的区别

多表关联查询过滤条件写在on与where后的区别

2023-12-11 01:25| 来源: 网络整理| 查看: 265

SQL优化过程中,发现开发人员在写多表关联查询的时候,对于谓词过滤条件的写法很随意,写在on后面与where后面的情况均有,这可能会导致没有理解清楚其真正的含义而无法得到期望的结果。

多表关联连接方式有inner join、left join、right join、full join四种,下面通过实验来说明不同连接方式谓词放在on与where后的效果与影响。

初始化测试数据

create table t1(id number(10),name varchar2(30),status varchar2(2)); create table t2(id number(10),mobile varchar2(30)); insert into t1 values(1,'a','1'); insert into t1 values(2,'b','1'); insert into t1 values(3,'c','1'); insert into t1 values(4,'d','1'); insert into t1 values(5,'e','1'); insert into t1 values(6,'f','0'); insert into t1 values(7,'g','0'); insert into t1 values(8,'h','0'); insert into t1 values(9,'i','0'); insert into t1 values(10,'j','0'); insert into t2 values(1,'12345'); insert into t2 values(2,'23456'); insert into t2 values(3,'34567'); insert into t2 values(6,'67890'); insert into t2 values(7,'78901');

1.Inner join

SQL>select * from t1 inner join t2 on t1.id=t2.id and t1.status=‘1’;

ID NAME ST ID MOBILE

1 a 1 1 12345 2 b 1 2 23456 3 c 1 3 34567

SQL> select * from t1 inner join t2 on t1.id=t2.id where t1.status=‘1’;

ID NAME ST ID MOBILE

1 a 1 1 12345 2 b 1 2 23456 3 c 1 3 34567

我们发现谓词t1.status=’1’放在on后与where后结果一样,它们的执行计划相同,说明CBO对这两种情况做了相同处理。 执行计划如下图所示:

Inner join时谓词不管放在哪个位置,CBO都先对t1表过滤,再与t2表关联。

2.left join

(1)左右表谓词过滤都放在on后面: SQL> select * from t1 left join t2 on t1.id=t2.id and t1.status=‘1’ and t2.id



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有