🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 5.5: FULL OUTER JOIN - 结合两个表的所有内容

FULL OUTER JOIN 是最全面的连接类型。当左表或右表中有匹配时,它会返回所有行。它本质上是 LEFT JOINRIGHT JOIN 的组合。

什么是 FULL OUTER JOIN?

FULL OUTER JOIN 创建一个结果集,包含两个表中的所有记录。

  • 如果有行匹配,则两个表的列都会被填充。
  • 如果左表中有一行在右表中没有匹配,则右表的列为 NULL
  • 如果右表中有一行在左表中没有匹配,则左表的列为 NULL

可视化:

   表 A (potential_leads)    表 B (active_clients)
   +----+----------+            +----+----------+
   | id | name     |            | id | status   |
   +----+----------+            +----+----------+
   | 1  | Alice    | <--------> | 1  | Active   | (匹配!)
   | 2  | Bob      | <--------? | NULL          | (仅潜在客户,尚无账户)
   | NULL          | <--------> | 3  | Active   | (仅客户,不在潜在客户列表中)
   +----+----------+            +----+----------+

FULL OUTER JOIN 语法

SELECT
    table1.column1,
    table2.column2
FROM
    table1
FULL OUTER JOIN
    table2 ON table1.common_column = table2.common_column;

关于数据库支持的重要说明: 并非所有数据库系统都原生支持 FULL OUTER JOIN

  • PostgreSQL、SQL Server 和 Oracle 支持它。
  • MySQL 和 MariaDB 支持它。

MySQL/MariaDB 的解决方法

由于 MySQL 没有 FULL OUTER JOIN,开发人员通过结合 LEFT JOINRIGHT JOIN 使用 UNION 运算符来实现相同的结果:

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;

实际示例

想象一下,我们正在合并来自两个不同分支办公室的数据。分支 A 有自己的客户列表,分支 B 也有自己的客户列表。我们想要一个完整的客户列表,显示两个分支之间的重叠部分。

SELECT
    a.customer_name AS branch_a_name,
    b.customer_name AS branch_b_name
FROM
    branch_a_customers AS a
FULL OUTER JOIN
    branch_b_customers AS b ON a.customer_id = b.customer_id;

本课的关键要点

  • FULL OUTER JOIN 返回两个表中的所有记录。
  • 它使用 NULL 填补在任一侧未找到匹配的空白。
  • 它是 数据库同步 和查找两个列表之间差异的最佳工具。
  • 如果您的数据库不支持它(如 MySQL),请使用 LEFT 和 RIGHT 连接的 UNION