阅读完需:约 3 分钟
在一般的业务情况下,我们大致将 Mysql多表连接 分为如下几种:
内连接:INNER JOIN – 可简写为 JOIN;
左外连接:LEFT OUTER JOIN – 可简写为 LEFT JOIN;
右外连接:RIGHT OUTER JOIN – 可简写为 RIGHT JOIN;
全连接:使用 UNION 完成;
交叉连接:CROSS JOIN – 也称为 笛卡儿乘积连接,大抵不使用;
内连接 – INNER JOIN
:
SQL
语句:
SELECT *
FROM a
INNER JOIN b ON(a.id = b.id)
解释:
查询出 a表
和 b表
的 交集
;
左外连接 – LEFT OUTER JOIN
:
SQL
语句:
SELECT *
FROM a
LEFT OUTER JOIN b ON(a.id = b.id)
解释:
查询出 左边表 -- 即a表
的完全集,而 右边表 -- 即b表
中匹配的则有值,没匹配的以 null
值取代;
右外连接 – RIGHT OUTER JOIN
:
SQL
语句:
SELECT *
FROM a
RIGHT OUTER JOIN b ON(a.id = b.id)
解释:
与 左外连接相反
,查询出 右边表 -- 即b表
的完全集,而 左边表 -- 即a表
中匹配的则有值,没匹配的以 null
值取代;
全连接 – 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
取代;
交叉连接 – 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