UNION JOIN不存在,是常见误解;MySQL不支持FULL OUTER JOIN,需用LEFT JOIN+RIGHT JOIN+UNION模拟,注意字段对齐、NULL补位及避免交集重复。

UNION JOIN 不是标准 SQL 语法,也从未被 MySQL、PostgreSQL 或 SQL Server 等主流数据库支持——它根本不存在。你看到的“UNION JOIN”大概率是文档笔误、AI幻觉,或把 UNION 和 JOIN 两个独立操作强行拼在一起造成的误解。
MySQL 报 ERROR 1064 时,别查 UNION JOIN 了
执行类似 SELECT * FROM a UNION JOIN SELECT * FROM b 会直接报错:ERROR 1064 (42000): You have an error in your SQL syntax。这不是你少写了括号或引号,而是解析器压根不认识 UNION JOIN 这个组合词。SQL 标准里没有这个关键字,各数据库实现中也无对应语义。
-
UNION是集合操作符,用于合并多个SELECT的结果集 -
JOIN是表连接操作符,作用于FROM子句中,描述两表如何关联 - 二者语法层级不同,不能连写;想“先 join 再 union”或“union 后再 join”,必须显式拆成子查询或 CTE
所谓“用 FULL JOIN 替代 UNION JOIN”纯属伪命题
FULL JOIN(或 FULL OUTER JOIN)是真实存在的标准语法,在 PostgreSQL、SQL Server、Oracle 中原生支持;但它和 UNION 不是替代关系,而是解决不同问题的工具:
-
FULL JOIN关注「按某条件匹配两表行」:保留左表所有行 + 右表所有行,不匹配处填NULL -
UNION关注「垂直拼接结果集」:要求列数/类型一致,做的是行级并集(去重),不涉及表间关联逻辑 - 比如你想比对用户表和订单表中「谁有账号但没下单」「谁下了单但没账号」,该用
FULL JOIN;而你想把「本月活跃用户」和「本月新注册用户」名单合并不重复名单,才用UNION
MySQL 用户真正要面对的问题:没有 FULL JOIN 怎么办
MySQL 直到 8.0.32 版本仍不支持 FULL JOIN,执行会报错。此时唯一合规路径是手动模拟:
- 必须用
UNION(不是UNION ALL),否则交集行重复两次 - 字段顺序、数量、类型必须严格一致;缺字段得补
NULL AS col_name -
LEFT JOIN部分 +RIGHT JOIN ... WHERE 左表主键 IS NULL更安全,避免重复交集 - 示例(t1.id ↔ t2.t1_id):
SELECT t1.id, t1.name, t2.t1_id, t2.value FROM t1 LEFT JOIN t2 ON t1.id = t2.t1_id UNION SELECT t1.id, t1.name, t2.t1_id, t2.value FROM t2 LEFT JOIN t1 ON t1.id = t2.t1_id WHERE t1.id IS NULL;
性能敏感场景下,这种写法在大表上容易变慢——它实际触发两次 JOIN 扫描,且 UNION 需排序去重。如果只是临时查差异,加好索引还能忍;要是进报表或高频接口,建议提前物化中间状态,或换用支持原生 FULL JOIN 的数据库。
最常被忽略的一点:ON 条件里若含 NULL(比如 t1.status IS NULL),LEFT JOIN 仍会返回左表全量,但匹配逻辑已失效——这时模拟 FULL JOIN 的结果可能和预期严重偏离,务必先清洗或用 COALESCE 统一空值语义。










