多表联合查询过滤要求写在on与where后的差别

原创
小哥 3年前 (2022-10-30) 阅读数 114 #大杂烩

目录

前言:

1.初始化测试数据:

二、inner join--内部关联表:

三、left join--左外关联表(left outer join,outer可略去)

1当写入左表和右表的谓词时on后面:

2当写入左表的谓词时where稍后,右表的谓词被写入on后面:

3当写入左表的谓词时on稍后,右表的谓词被写入where后面:

4当左表和右表的谓词放在一起时where后面:

四、right join--右外关联表(right outer join,outer可略去) :

五、full join-- 全力关联表(full outer join,outer可略去):

1当写入左表和右表的谓词时on后面:

2当写入左表的谓词时where稍后,右表的谓词被写入on后面:

3当写入左表的谓词时on稍后,右表的谓词被写入where后面:

4当左表和右表的谓词放在一起时where后面:

6.摘要:

1、内部连接:

2,左侧外部连接:

3,右外部连接:

4、全力联动:


前言:

多表关联的连接方式如下inner join、left join、right join、full join第四,下面的实验表明,不同的连接谓词放置在on与where效果和之后的效果。

1.初始化测试数据:

--创建表t1和t2
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,0);
insert into t1 values(5,e,0);
insert into t2 values(1,12345);
insert into t2 values(2,23456);

--查询表的数据
select * from t1;
select * from t2;

二、inner join--内部关联表:

select t1.id,t1.name,t1.status,t2.id,t2.mobile from t1 inner join t2 on t1.id = t2.id and t1.status = 1 and t2.id <2;
select t1.id,t1.name,t1.status,t2.id,t2.mobile from t1 inner join t2 on t1.id = t2.id and t1.status = 1 where t2.id <2;
select t1.id,t1.name,t1.status,t2.id,t2.mobile from t1 inner join t2 on t1.id = t2.id where t1.status = 1 and t2.id <2;
select t1.id,t1.name,t1.status,t2.id,t2.mobile from t1 inner join t2 on t1.id = t2.id and t2.id <2 where t1.status = 1;

执行结果如下,4结果是一样的。

放在on后与where在结果相同后,它们有相同的实施计划,表明CBO两个病例都进行了相同的治疗。

三、left join--左外关联表(left outer join,outer可略去)

-- 放置了左表谓词过滤和右表谓词过滤。on后面
select t1.id, t1.name, t1.status, t2.id, t2.mobile
  from t1
  left join t2
    on t1.id = t2.id
   and t1.status = 1
   and t2.id < 2;
-- 左表的谓词写在where稍后,右表的谓词被写入on后面
select t1.id, t1.name, t1.status, t2.id, t2.mobile
  from t1
  left join t2
    on t1.id = t2.id
   and t2.id < 2
 where t1.status = 1;
-- 左表的谓词写在on稍后,右表的谓词被写入where后面
select t1.id, t1.name, t1.status, t2.id, t2.mobile
  from t1
  left join t2
    on t1.id = t2.id
   and t1.status = 1
 where t2.id < 2;
-- 放置了左表谓词过滤和右表谓词过滤。where后面
select t1.id, t1.name, t1.status, t2.id, t2.mobile
  from t1
  left join t2
    on t1.id = t2.id
 where t1.status = 1
   and t2.id < 2;

执行结果如下,左侧关联表差异很大:

1当写入左表和右表的谓词时on后面:

t1.status=’1’放在on后面,t1该表没有谓词。status过滤,结果集显示t1完整的表数据。这是left join左表显示了所有数据。t2.id<2是先对t2表被筛选,然后连接,而t1.status=’1‘作为连接条件存在,并过滤连接过程中生成的笛卡尔乘积数据。

2当写入左表的谓词时where稍后,右表的谓词被写入on后面:

过滤之前的两个表left join,将结果集与写入的where背面不同,连接方式或左外连接,显示t1过滤后的所有数据。

3当写入左表的谓词时on稍后,右表的谓词被写入where后面:

这种情况首先是对的。t2表筛选,和t1.id=t2.id,因此左连接将被转换为内连接,并且左表的谓词条件在任何位置都将相同。而且因为t2表过滤数据比率t1表少,CBO把t2该表充当动因表。

4当左表和右表的谓词放在一起时where后面:

它是先对表进行过滤,然后再连接过滤后的数据。我们发现t1该表将自动添加。id<2过滤条件,这是因为有这样一个事实t1.id=t2.id等价连接,如果t1表上id如果您有一个索引,您可以看到性能上的差异。请注意,Connection方法已变为hash join这是因为写入了右表的谓词过滤条件。where后面,CBO左侧连接相当于内部连接。

四、right join--右外关联表(right outer join,outer可略去) :

右边的连接与左边的连接相反,右边的表显示了所有写入的数据。on稍后,谓词过滤在正确的表上不起作用。

五、full join-- 全力关联表(full outer join,outer可略去):

完全连接在应用程序中似乎很少遇到,但它的存在是合理的,如下所示。

1当写入左表和右表的谓词时on后面:

在这种情况下,不会首先筛选这两个表,而是将其作为连接条件进行筛选。如果满足连接,则显示左右两个表的数据,另一个表的字段显示为空。

2当写入左表的谓词时where稍后,右表的谓词被写入on后面:

这种情况被转换为左外部连接,在关联之前也会在两个表上进行过滤。

3当写入左表的谓词时on稍后,右表的谓词被写入where后面:

此案例被转换为右外部连接,但在关联之前也会在这两个表上进行过滤。

4当左表和右表的谓词放在一起时where后面:

这种情况CBO将其转换为内部连接,在关联之前进行过滤。

6.摘要:

1、内部连接:

中的关联条件on后面或者where后来,查询结果也是一样的。

2,左侧外部连接:

中的左侧和右侧表谓词on稍后:左边的表格显示了所有原因left join功能,右表过滤,然后关联。
左边的表谓词在on稍后,正确的表谓词出现了。where稍后:因为正确的表谓词在。where之后,因此应该首先过滤右表,并且由于左表和右表的关联条件t1.id=t2.id,使左侧关联转换为内部关联。
左边的表谓词在where稍后,正确的表谓词出现了。on稍后:左表和右表按谓词过滤,然后关联,以显示过滤左表后的所有数据。
中的左侧和右侧表谓词where稍后:根据左表和右表的关联条件,按谓词过滤左表和右表。t1.id=t2.id,使左侧关联转换为内部关联。
因此,如果希望左表中的谓词起作用,则需要将它们放入表中。where稍后,如果希望正确表的谓词起作用,则需要将其放入on后面。

3,右外部连接:

它类似于左侧的外部连接,具有相反的效果。

4、全力联动:

不常见,但也介绍:
中的左侧和右侧表谓词on稍后:如果不过滤,则匹配连接,如果不匹配连接,则会显示左右两个表,另一个表将为空。
左边的表谓词在on稍后,正确的表谓词出现了。where稍后:转换为右连接,关联前过滤。
左边的表谓词在where稍后,正确的表谓词出现了。on后期:转换为左连线,关联前过滤。
一句话:那边那张表的谓词是where后者,也就是那里的连接,首先被过滤,然后被关联。
中的左侧和右侧表谓词where稍后:转换为内部连接,在关联之前进行过滤。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门