对各种join的理解

  最近使用left join,inner join时,发现对它们的理解并不到位,在此总结一下。

  首先,对于left join,right join,inner join 以及outer join的区别,当ON条件之后在各自表中都有唯一约束时,可以参考 https://blog.csdn.net/weixin_41796956/article/details/85044152 中对于他们的描述,这个图总结得很好。

  

  但是,这里需要再次强调的是,只有当我们设置的条件ON后的字段,在两张表中都具有唯一约束时,这个图才能准确地反映出JOIN之后的结果。如果ON后的条件并不具备唯一性,那么join的结果与图中的结果并不相符。下面给出例子,结果集已经超出整个A1表的范围:

 

  在该例子中,B1表中的code不是唯一约束,所以在join之后,B表中与A表中code相同的内容,会以笛卡尔积的形式体现出来。

  

  这种重复字段以笛卡尔积的形式出现,对于inner join同样适用(left join与inner join的区别在于:left join时,即使B表中在ON条件不符合,A表中的内容还是会完整地展示出来,B中不存在但又必须展示的字段以Null补齐;而inner join对双方都要保证ON后的字段存在,不存在的不会以Null补齐。注意分析需求,对应的场景需要采用合适的关键词)。

  所以,这里要特别注意的是,在使用join,且ON条件之后的字段内容有重复时,注意去重,一般在子表或者JOIN结果集使用GROUP BY进行去重操作。

  

原文地址:https://www.cnblogs.com/bruceChan0018/p/14868930.html