多表联结,以及如何选择联结的类型
在一般的业务情况下,我们大致将 Mysql多表连接 分为如下几种:
内连接:INNER JOIN – 可简写为 JOIN;
左外连接:LEFT OUTER JOIN – 可简写为 LEFT JOIN;
右外连接:RIGHT OUTER JOIN – 可简写为 RIGHT JOIN;
全连接:使用 UNION 完成;
交叉连接:CROSS JOIN – 也称为 笛卡儿乘积连接,大抵不使用;
记住下面这张图,遇到多表联结的时候从这张图选择对于的sql。
注意:
1、全连接 – UNION:
事实上由于 Mysql 不支持 FULL JOIN,所以我们将使用 UNION 来完成 全连接;
SQL 语句:
SELECT * FROM a LEFT OUTER JOIN b ON(a.id = b.id) UNION SELECT * FROM a RIGHT OUTER JOIN b ON(a.id = b.id)
解释:
全连接 是 左右外连接 的并集,连接表包含被连接的表的所有记录,如果缺少匹配的记录,,则以 null 取代;
2、交叉连接 – CROSS JOIN:
CROSS JOIN 子句从连接的表返回行的 笛卡儿乘积;
假设使用 CROSS JOIN 连接两个表;
结果集将包括两个表中的所有行,其中结果集中的每一行都是第一个表中的行与第二个表中的行的组合;
当连接的表之间没有关系时,会使用这种情况;
要特别注意的是,如果每个表有 1000 行,那么结果集中就有 1000 x 1000 = 1,000,000 行,那么数据量是非常巨大的;
SQL 语句:
SELECT * FROM a CROSS JOIN b /** * 注意: * 与 INNER JOIN 或 [LEFT, RIGHT] OUTER JOIN 子句不同 * CROSS JOIN 连接没有 ON 条件 */
添加了 WHERE 子句后,如果 a表 和 b表 有关系,则 CROSS JOIN 的工作方式与 INNER JOIN 类似,SQL 语句为:
SELECT * FROM a CROSS JOIN b WHERE a.id = b.id
参考: