分析维度:过滤条件是否针对关联键、left join的情况下过滤条件针对左表还是右表、过滤条件在where中还是on中。
实践要点:
1.当过滤条件针对左表时,条件是否针对关联键位、条件写在哪不影响最终的结果。但是当条件在where中时,会在扫描表的时候就过滤。
2.当过滤条件针对右表时,条件是否针对针对关联键位不影响最终的结果。但是条件在on 中时,在扫表时过滤,结果的数据条数与左表一致;条件在where中时,在join后进行过滤,结果的数据会过滤掉关联后右表不满足条件的数据,会比左表数据量少。
一、针对关联键的过滤,过滤左表的条件:
图顺序:左on-右where
结论:
on 在 join时 过滤 左表
where 在 扫表时 过滤 两表
结果都一样
二、针对关联键的过滤,过滤右表的条件:
图顺序:左on-右where
结果:
on 在 扫表时 过滤 右表
where 在 join后 过滤 结果
结果不一样,
on时,数据条数与左表一致,
where时,会过滤掉右表键为null的数据
三、针对非关联键的过滤,过滤左表的条件:
图片顺序:左on-右where
结果:
on 在 join时 过滤 左表
where 在 扫表时 过滤 左表
结果都一样
四、针对非关联键的过滤,过滤右表的条件:
图片顺序:左on-右where
结论:
on 在 扫表时 过滤 右表
where 在 join后 过滤 结果
结果不一样:
on时,数据条数与左表一致。
where时,会过滤掉右表键为null的数据
补充:内连接的情况
一、只关联不过滤时,外连接与内连接的区别
结论:
外 不做任何 过滤
内 在 扫表时 过滤 两表(默认过滤关联键不为 null)
二、内连接 - 过滤非关联键
结论:
无论是过滤左表、右表 - on 、where 的结果都一样,全都在扫表时过滤,若是左表条件则过滤左表,若是右表条件则过滤右表
三、内连接 - 过滤关联键
结论:
无论是过滤左表、右表- on 、where 的结果都一样,全都在扫表时过滤,过滤两表