答案 Pablo Santa Cruz 是正确的;但是,如果有人偶然发现这个页面并想要获得更多说明,这里有一个详细的分类。
示例表
假设我们有下表:
-- t1
id name
1 Tim
2 Marta
-- t2
id name
1 Tim
3 Katarina
内连接
内连接,如下所示:
SELECT *
FROM `t1`
INNER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
只会获取同时出现在两个表中的记录,如下所示:
1 Tim 1 Tim
内连接没有方向(如左或右),因为它们明确是双向的 - 我们要求两边匹配。
外连接
另一方面,外连接用于查找可能在另一个表中没有匹配项的记录。因此,您必须指定 哪一侧 允许有缺失记录。
LEFT JOIN
和 RIGHT JOIN
是 LEFT OUTER JOIN
and RIGHT OUTER JOIN
;下面我将使用它们的全名来强化外连接与内连接的概念。
左外连接
左外连接,如下所示:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
...将会获取左表中的所有记录,无论它们是否在右表中匹配,如下所示:
1 Tim 1 Tim
2 Marta NULL NULL
右外连接
右外连接,如下所示:
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
...将会获取右表中的所有记录,无论它们是否在左表中匹配,如下所示:
1 Tim 1 Tim
NULL NULL 3 Katarina
全外连接
完全外连接将为我们提供两个表中的所有记录,无论它们是否在另一个表中有匹配项,如果没有匹配项,则两边都为 NULL。结果如下所示:
1 Tim 1 Tim
2 Marta NULL NULL
NULL NULL 3 Katarina
然而,正如 Pablo Santa Cruz 指出的那样,MySQL 不支持这一点。我们可以通过对左连接和右连接进行 UNION 来模拟它,如下所示:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
UNION
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
您可以将 视为 UNION
“运行这两个查询,然后将结果堆叠在一起”;其中一些行来自第一个查询,而一些来自第二个查询。
需要注意的是, UNION
MySQL 中的 会消除精确重复项:Tim 会出现在这里的两个查询中,但 的结果 UNION
只列出了他一次。我的数据库专家同事认为不应该依赖这种行为。因此,为了更明确地说明这一点,我们可以 WHERE
在第二个查询中添加一个子句:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
UNION
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
WHERE `t1`.`id` IS NULL;
另一方面,如果你 想要 查看重复项,则可以使用 UNION ALL
.