00:00
接下来我们关注一下这个left join。那right join跟left join就相反就可以了,我们就测一个left join,那这一边呢,咱们区分还是写在过滤条件,写在on跟写在where的一个区别,还有呢,就是一个咱们过滤字段,前面两个都是左表,后面呢咱们用右表的来试一试啊,看看有什么区别没有啊,咱们通过实际的案例来分析啊,那同样的咱们直接执行啊。等待他出结果。执行完了,那我们挨个来比较啊,首先是第一个left on左表。啊,就是这个咱们两张表进行一个左外关联,然后呢,将左表的一个ID字段过滤,写在on的关联条件上面啊。那我们首先看一下结果集,咱们左外关联的话,是不是应该左边有,右边没有的话,右边用闹填充啊,那至少从结果上来讲是OK的啊,是OK的,当然这边为什么全是闹啊,因为只显示了20行,肯定有九以上的啊,比如说一呢,肯定是九以上的,那我们看一下最新计划。
01:20
那直接看到解析跟优化的这个逻辑计划,首先。上面是扫描左表,下面扫描右表之后呢,进行一个左外关联,再之后才是一些关联条件,还有一个过滤条件。这是普通计划,那么经过优化之后呢?大家可以看到这个。右表会进行过滤,左表呢。没有过滤,而且是在什么时候才过滤啊。勾引的时候才进行过滤。这个就是咱们写在on上面,大家可以发现他只推了谁啊,推了右表。
02:05
啊,推了右表,因为咱们左外关联肯定是希望保留左表所有的数据,那这个时候左表就不应该提前过滤了,要不然的话岂不是变得跟内关联一样了,所以这个咱们也是可以理解,这是第一个大家关注的点,啥时候过滤,过滤了谁,这是写在on上面,那我们再来看看写在where下面。这个是left v,然后呢,过滤条件是左表的。截个图。好,那首先我们观察一下这个东西。这个结果是咱们希望的吗?这看起来像不像是一个inner join?对吧,虽然只打印了20行,那么你可以选择把更多的行打印出来,你看看有没有说。右边为闹的。这个看起来不像是左外关联对吧,我们看一下执行计划。
03:04
为什么会出现这个场景呢?那首先还是一个查左表,查右表没有过滤。然后呢,就。运的时候。也没过滤,放影完之后才进行过滤,因为是写在where嘛,啊写在where好,那接下来。我们往下看。在这种场景下呢?呃,先看这个吧。先看这个。这个的话,它首先。做了一个什么Fi,是不是提前对它进行个过滤啊,那么下面的是谁啊,右表啊,这是右表对不对。下面的是右表,然后呢。取出这几个字段图表。上面这个。它也是读的时候先进行过滤,过滤完之后进行一个交易所没有过滤,那这边大家应该都发发现了,不管是左表还是右表,它都会进行一个啥呀。
04:12
过滤,那两个都过滤出来再进行join,是不是有点像inner join呢,对吧?所以这种写在on跟where它的下推在外关联的时候,执行结果是不一样的。这个是咱们要尤其注意的地方,而且咱们从上面这个结果也可以分析出来,因为左边过滤出来小于二的,右边也过滤出来要小于二的。那大于二的那些左表是不是也没了,结果跟我们之前上面这种就不一样啊,不一样,那你那它并不是错呀,其实咱们从SQL语句来分析啊,从SQL语句来分析,左表跟右表关联,左外关联。这个时候是不是肯定有一一关联上的,还有一些比如说三闹这种啊,对吧,还有什么四闹这种,呃,二闹这种,这个是不是咱们正常的一个join结果呀,哎,之后你在执行的一个过滤where ID小于二的,那是不是只保留这个,那其他的都不要了,所以咱们从circle的语义上来讲,这个结果是正确的。
05:23
但是如果你想要的不是这样的,你要小心不要写在V这里啊,这是要提醒大家了,因为写在V它两边都会过滤啊。另外也可以看到。往下。这个时候咱们的。过滤条件是右表的啊。啥意思呢?来咱们观察一下这个。仍然是一个阻碍关联,那还有一个过滤条件是写在on一起的,它但是它的过滤是右表的条件啊。
06:02
二就是右表嘛,对右表进行过滤,那我们想想这个结果是咱想要的吧,对吧。左边的都保留了,那右边没有人用now,那右边肯定是只有小于二的数据,从结果上来讲看起来没太大毛病,看一下执行计划。呃,直接看到优化的这里,呃,优化的这里你看。一张表过滤另外一张表。没有过滤。对吧,另一张表找不到过滤的地方了,这里没有过滤啊。好。因为从咱们的语句上来讲,左外关联是不是希望左边所有的数据都保留啊啊,所以左表不应该过滤,这个是OK的啊OK。那这个呢,它是在扫表的时候,位置下推,帮我们提前进行了一个过滤啊,是这么一回事啊。那这个看起来很正常对吧,那在接下来再注意了,再下一个。
07:10
这个时候还是阻碍关联,但是过滤条件写在V,另外呢,过滤的字段是属于右表的啊,是属于右表的。那这个时候我们瞅一瞅啊。它的结果是不是像一个inner join对吧?那你从circlel语句先分析一下,按照咱们这个写法,是不是应该先量表九上啊,那九引上是不是应该有这种,呃,小于五对吧,这边是二加35嘛,那可能有11223344,哎,然后呢。五。Now。六闹七闹,咱们想要的是不是这种结果?Left join,然后呢,咱们再过滤出小于五的,也就是说。
08:04
这个数据,这个数据在最终的时候被咱过滤掉保留下来,是不是相当于说只有九以上的呀,对吧,按照咱们这个蛇口写法就应该是这个结果啊,那我们看看他有没有帮我们做位置下推提前过滤呢。我们直接看到这个优化后的计划来,你看首先扫这张表的时候。是不是做了一个过滤,扫另外一张表的时候。是不是同样帮我们进行了过滤啊?对吧,两张表都过滤完之后,它转换成了一个什么inner。对吧,因为从咱们的搜口语句来讲,你这玩意儿不就是一个inner Joy吗?啊,这点是咱们写circle的时候,这个关联条件的过滤,咱们要尤其注意了,要写在哪里啊,另外大家可能也关注到了,有个东西叫动态分区裁剪啊,那它是裁剪出咱们需要的分区,避免没必要的读取分区啊,你看DTDN啊,大家知道一下这个玩意就行了,动态分区裁剪啊,其实前面也有啊。
09:17
好了,那么。包括咱们前面那个左表写where,我们看一看啊。啊,Left where左表。咱们执行计划,其实它也是帮我们转成了啥呢。他没转成婴儿吧?对吧,啊,这边还是有点不一样的啊,不一样的。总而言之,我们来总结一下啊,好像写在where,你别管它转成什么纠音了,是不是两表都过滤?如果是写在on,是不是只对右表过滤啊?咱们前提是left join,它只会对右表过滤,那么反过来,如果咱们是个right join,我写在on里面的,不管是左表还是右表,就应该会对左表进行一个过滤,如果我写在where里面。
10:11
过滤条件。Right join的话,那他应该是对两表都会进行过滤,所以这个是大家要注意的,他位直下推,总体原则思想呢,能提前过滤就帮我们提前过滤,那么要关注的是外关联的时候,咱们过滤条件写在on跟位它的。语义,首先从语义上它就不一样,那结果当然也不一样,这个要小心了,这个结果也不算什么正确不正确了,咱们把这个干掉啊。这个是提特意标红提醒大家啊,这样大家去那右表呢,Right join大家也可以自己去玩一玩啊,结果跟left join是相呃相对的啊,相对。
我来说两句