1 join的本质都是在计算两个表的笛卡尔乘积
就是A中的每一行和B中的每一行构成新的表中的一行。其它的join都是在这个表的基础上执行相应的操作。
inner join、full outer join、cross join在不加条件的时候,返回的是两个表的笛卡尔积。
2 inner join
在两个集合的笛卡尔积中选出满足条件的行出来。
where是隐式连接,inner join是显式连接,二者没有本质的区别。
3 outer join
3.1 full outer join
mysql不支持full join
首先,从笛卡尔积集合中选择出满足条件的行,然后列出两个集合中没有匹配上的行,对于没有匹配上的行,另外一个表中相应的列设置为NULL,也就是说,最终生成的表中包含了原来的表中的所有的行,只不过除了满足条件的笛卡尔积行外,还有没有匹配上的加了NULL的行。
3.2 left outer join
首先从笛卡尔积集合中选择出满足条件的行,然后列出前面一个表中没有被选出的所有的行,对应的列都设置为NULL。这样,最终生成的表中除了包含满足条件的笛卡尔积中的行,还包含了原来前面的表中的所有的行。
3.3 right outer join
首先从笛卡尔积集合中选择出满足条件的行,然后列出后面一个表中没有被选出的所有的行,对应的列都设置为NULL。这样,最终生成的表中除了包含满足条件的笛卡尔积中的行,还包含了原来后面的表中的所有的行。
4 cross join
两个集合的笛卡尔积,也可以加on,结果和inner join一样,但是cross join是先计算笛卡尔积,然后再根据条件选,更费时,并且耗内存,inner join直接选择,更优。