Skip to content

外连接


外连接在连接两个表时,会保留指定表(左表或右表)的全部记录,即使另一张表中没有匹配的行。对于不匹配的部分,缺失的字段会用 NULL 填充。

左连接会保留左边表中的所有记录,无论右边表中是否有匹配的记录。如果右边表中没有与左表记录匹配的行,右表的列会填充 NULL 值。

SELECT 查询字段
FROM 表1
LEFT JOIN 表2 ON 表1.关联字段 = 表2.关联字段;

右连接会保留右表中的所有记录,无论左表中是否有匹配的记录。如果左表中没有与右表记录匹配的行,左表的列会填充 NULL

SELECT 查询字段
FROM 表1
RIGHT JOIN 表2 ON 表1.关联字段 = 表2.关联字段;

慎用 RIGHT JOIN,它容易让逻辑变得不直观,尤其在多表连接时,建议优先使用 LEFT JOIN

返回 左表和右表中所有的记录,并在没有匹配时将缺失的部分用 NULL 填充。与 左连接(LEFT JOIN)右连接(RIGHT JOIN) 不同,全外连接会保留两个表中的所有记录,不管它们是否有匹配的行。

SELECT 查询字段
FROM 表1
FULL OUTER JOIN 表2 ON 表1.关联字段 = 表2.关联字段;
  • 支持 FULL OUTER JOIN 的数据库包括:PostgreSQL、SQL Server、Oracle、SQLite(3.39.0+)等,但 MySQL 和 MariaDB 不支持。可在 MySQL 中如何实现 FULL OUTER JOIN 效果
SELECT
表1.字段A,
表2.字段B,
表2.字段C
FROM 表1
LEFT JOIN 表2 ON 表1.关联字段 = 表2.关联字段
UNION
SELECT
表1.字段A,
表2.字段B,
表2.字段C
FROM 表1
RIGHT JOIN 表2 ON 表1.关联字段 = 表2.关联字段;
  • ONWHERE 的区别

ON 条件连接过程中进行过滤,用于决定哪些行参与连接。对“非主表”(如 LEFT JOIN 中的右表)的条件应写在 ON 中,才能保留主表的全部记录。

WHERE 条件连接完成之后对结果集进行过滤。如果在 WHERE 中对非主表字段加条件,会导致主表中不匹配的记录被过滤掉,使外连接退化为内连接(主表数据不是全保留)。