数据库:Sql Join
Knowledge
笛卡尔积
笛卡尔乘积–数学中, 两个集合 X 和 Y 的笛卡尔积(Certersian product), 表示为 X * Y, 所有的有序对集合.
例如, 对于A={a,b}, B={0,1,2}, 则笛卡尔积结果为:
1 | A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)} |
注意, 他们是有序的.
Cross Join
说明
“交叉连接”-无法用”文式图”进行表示, 其结果就是1.1所述的”笛卡尔积”的结果, 一般而言不会做该查询, 性能消耗过于巨大.
例如对于两个表 A(10000条数据), B(100条数据), 则查询时会产生10000 * 100条记录, 这对于仅仅想获取 B 中某一个记录的 SQL 来说过于巨大.
命令
1 | SELECT * FROM TableA CROSS JOIN TableB; |
Inner Join
说明
“内连接”, 即数学中的交集, 从另外一个角度考虑: 内连接 = 交叉连接 + 限制条件.
实际上在有些 DB Server中, 可以通过”交叉连接”语句 + where限制条件达到和”内连接”语句一样的效果, 反之同理, 但是在通用DB Server中不会顺利执行.
format
1 | SELECT * FROM TableA INNER JOIN TableB ON <condition>; |
等值连接
命令: SELECT * FROM T1 INNER JOIN T2 ON T1.id = T2.id;
不等值连接
命令: SELECT * FROM T1 INNER JOIN T2 ON T1.count > T2.count;
自连接
使用场景: 操作对象只有一个表, 自己连接自己, 例如一张存放推荐人与被推荐人的, A是 B 的推荐人, 同时 A 也可能是C 的推荐人, 此时可能会涉及自连接查询.
Outer Join
Left Outer Join
说明: Left Join = Inner Join + 左侧表不符合连接条件的所有记录
format:
1 | SELECT * FROM T1 LEFT OUTER JOIN T2 ON <condition>; |
Negation Right Join
通过限定条件, 获取Right Outer Join的非集.
命令: SELECT * FROM T1 LEFT JOIN T2 ON T1.id=T2.id where T2.id is null;
Right Outer Join
同 Left Outer Join相反.
MY Left Join
见4.2节
Union
Union
说明: 将前后两项查询集累加在一起, 必须确保前后两项的查询项相等, 查询项个数相等, 自动合并相等的项.
Union: ELECT column_name(s) from T1 UNION SELECT column_name(s) from T2;
Union All
不自动合并相等的项, 其他等同于union查询.
Full Join
Intro
Mysql不支持全连接查询, 但是可以通过 left outer join + right outer join + union来实现全连接, 即数学意义上”去重复并集”.
Full Join
1 | SELECT * FROM T1 LEFT JOIN T2 ON T1.id=T2.id |
Negation Union Set
1 | SELECT * FROM T1 LEFT JOIN T2 ON T1.id=T2.id where T2.id is null(获取T1独有的元素) |