在SQL多表查询场景中,全外连接能够同时保留左表和右表的所有记录,当两边表的关联字段匹配时返回对应数据,匹配不上时对应表的字段用NULL填充。不过MySQL等部分数据库并不直接支持FULL OUTER JOIN语法,此时可以通过左连接和右连接合并的方式实现相同的查询效果。

标准FULL OUTER JOIN的使用方法
支持全外连接的数据库(如PostgreSQL、SQL Server、Oracle)可以直接使用FULL_OUTER_JOIN语法完成查询,基础语法结构如下:
-- 标准全外连接语法
SELECT
a.id AS left_id,
a.name AS left_name,
b.id AS right_id,
b.score AS right_score
FROM
left_table a
FULL OUTER JOIN
right_table b
ON
a.id = b.left_id;
上述查询会返回left_table的所有记录和right_table的所有记录,当a.id和b.left_id匹配时,对应行的字段都有值;如果left_table的某条记录在right_table没有匹配项,那么right_id和right_score会显示为NULL;反之right_table的未匹配记录对应的left_id和left_name会显示为NULL。
左右连接合并实现全外连接
对于不支持FULL OUTER JOIN的数据库,可以通过左连接查询和右连接查询的结果合并来实现,核心思路是先查左连接的所有结果,再查右连接中左表无匹配的记录,最后用UNION去重合并两部分结果。
第一步:执行左连接查询
左连接会保留左表所有记录,右表匹配不上的字段为NULL,代码如下:
-- 左连接查询
SELECT
a.id AS left_id,
a.name AS left_name,
b.id AS right_id,
b.score AS right_score
FROM
left_table a
LEFT JOIN
right_table b
ON
a.id = b.left_id;
第二步:执行右连接并过滤左表已匹配的记录
右连接会保留右表所有记录,我们需要过滤掉那些已经在左连接结果中出现的右表记录,也就是左表关联字段为NULL的记录,代码如下:
-- 右连接查询并过滤已匹配记录
SELECT
a.id AS left_id,
a.name AS left_name,
b.id AS right_id,
b.score AS right_score
FROM
left_table a
RIGHT JOIN
right_table b
ON
a.id = b.left_id
WHERE
a.id IS NULL;
第三步:用UNION合并两部分结果
将左连接的结果和过滤后的右连接结果用UNION合并,就可以得到和全外连接完全一致的结果:
-- 合并左右连接结果模拟全外连接
SELECT
a.id AS left_id,
a.name AS left_name,
b.id AS right_id,
b.score AS right_score
FROM
left_table a
LEFT JOIN
right_table b
ON
a.id = b.left_id
UNION
SELECT
a.id AS left_id,
a.name AS left_name,
b.id AS right_id,
b.score AS right_score
FROM
left_table a
RIGHT JOIN
right_table b
ON
a.id = b.left_id
WHERE
a.id IS NULL;
两种实现方式的对比
我们可以通过下表对比两种实现方式的差异:
| 对比维度 | 标准FULL OUTER JOIN | 左右连接合并 |
|---|---|---|
| 适用数据库 | PostgreSQL、SQL Server、Oracle等 | 所有支持左连接、右连接、UNION的数据库 |
| 语法复杂度 | 低,单条语句即可完成 | 高,需要两条查询语句合并 |
| 执行效率 | 数据库原生优化,效率更高 | 需要两次连接查询和一次合并,效率略低 |
| 结果一致性 | 完全一致 | 完全一致 |
注意事项
- 使用UNION合并时,两个查询的字段数量、字段顺序、数据类型必须保持一致,否则会报错。
- 如果右连接查询中不过滤左表已匹配的记录,直接用UNION合并会出现重复数据,因为左连接已经包含了所有匹配的记录。
- 如果需要保留重复记录,可以把UNION换成UNION ALL,但全外连接的语义本身是不包含重复记录的,所以通常不需要这么做。
全外连接的核心需求是保留两个表的所有记录,无论是否匹配,开发者可以根据实际使用的数据库类型选择合适的实现方式,优先使用原生FULL OUTER JOIN,不支持时再采用左右连接合并的方案。
SQL全外连接FULL_OUTER_JOIN左右连接合并修改时间:2026-07-12 04:33:22