https://blog.csdn.net/qq_25135655/article/details/78238848
https://blog.csdn.net/XiaoXiao_RenHe/article/details/78668544
https://www.jianshu.com/p/800ec0326fda
以下是自己的总结。
1. Inner join is getting the intersection of 2 tables based on the joinning column (the joining feature common in 2 tables)
Select * from TableA inner join TableB on TableA.name == TableB.name
Row number: 2
2. Outer join is getting the Union of the 2 tables based on the joining columns (the joining feature common in 2 tables)
Select * from TableA FULL OUTER JOIN TableB on Table.name == TableB.name
Row number: 4 + 4 - 2
2.1 Outer join with excluded intersection part
Select * from TableA FULL OUTER JOIN TableB on TableA.name == TableB.name where TableA.name == null OR TableB.name == null
Row number: 4 + 4 -2 - 2
3. Left [OUTER] JOIN
(1) SELECT * FROM TableA LEFT OUTER JOIN TableB on TableA.name == TableB.name.
Row number: 4
(2) SELECT * FROM TableA LEFT OUTER JOIN TableB on TableA.name == TableB. name where TableB.name == null
4. RIGHT [OUTER] JOIN
(1) SELECT * FROM TableB LEFT OUTER JOIN TableA on TableB.name == TableA.name
(2) SELECT * FROM TableB LEFT OUTER JOIN TableA on TableB.name == TableB.name where TableA.name == null
最好的理解方式:
文氏图: 两个圈,有交集。 每个区域都可以通过join + where 表示出来。(每个区域其实都是代表row,两联合了两个表里的rows)
一共几个区域? 7
3 个小区
3 个中区 (由2个小区组成)
1 个大区 (由3个大区组成)
INNER JOIN 就是找到 交集 进行 两表合并(合并 columns,不是row),所以表里没有null 值
其他的JOIN, LEFT JOIN, RIGHT JOIN, 都是 OUTER JOIN. 都是做交集运算,所以允许表里有null
可以通过 where 语句把 null 的部分去掉,是有 null 的 row 去掉。
所以这个文氏图的每个区域部分,都是应该是 带有所有的 columns.
PS:
cross join 是产生笛卡尔积的 完全join,是个 完全组合 运算(combination),产生4X4 的行数。所以对性能的伤害性很大。
看另一个链接,找到了一个例子,在 LEFT JOIN 中也用到了 笛卡尔积。 这个例子是因为出现了多个可出现的组合,(突然想到,这其实就是groupBy 的反方向运算, groupBy是 把相同 column value的 多个不同column value 的row 进行aggregate压缩; 笛卡尔积 是将多个相同column value 的多个不同 column value 的row 进行 完全组合式的 扩充 )