在 ANSI 标准中,on除cross join. 这适用于 Oracle 和大多数其他数据库。
MySQL 有点不同。这是 MySQL文档中的语法图:
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference STRAIGHT_JOIN table_factor
| table_reference STRAIGHT_JOIN table_factor ON conditional_expr
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
也就是说,MySQL 允许on对 是可选的join,但不是left outer joinor right outer join。MySQL 不支持full outer join. 并且,为了使它更加混乱cross join,就像join并且可以接受一个on子句。
而且,您应该忽略 MySQL 扩展。 始终on对左、右和内连接 使用子句。永远不要使用on子句 for cross join。我更喜欢使用这些natural join(你不问),因为我更喜欢在用于连接的列中明确。
编辑:
根据SQL Fiddlefull outer join ,5.6 版在工作时出现错误left outer join。所以这会产生一个错误:
select *
from (select 1 as a) t1 full outer join
(select 2 as b) t2
on t1.a = t2.b;
这也会产生错误:
select *
from (select 1 as a) t1 full join
(select 2 as b) t2;
并且 MySQL 文档(通过 5.7)都非常清楚full join不支持。我不确定为什么您的查询可能有效。