课程 5.5: FULL OUTER JOIN - 结合两个表的所有内容
FULL OUTER JOIN 是最全面的连接类型。当左表或右表中有匹配时,它会返回所有行。它本质上是 LEFT JOIN 和 RIGHT 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 JOIN 和 RIGHT 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。