Mysql 当表引用被包装在括号中(在联接前面)时会发生什么?

Mysql 当表引用被包装在括号中(在联接前面)时会发生什么?,mysql,sql,Mysql,Sql,联接语法操作单个表引用(来自MySQL文档:): 如果我将多个表引用放在括号内并将其用作“table_引用”,那么在幕后会发生什么 (t1, t2, t3) JOIN (SELECT X FROM ... ) t4 ON (t4.X = t1.Y) 如果没有括号,我会得到一个错误:“on子句”中的未知列“t1.Y”。这是有道理的,因为它只是试图加入t3。但是,对于圆括号,它可以工作。如果您有以下表达式: from t1, t2, t3 join (select x

联接语法操作单个表引用(来自MySQL文档:):

如果我将多个表引用放在括号内并将其用作“table_引用”,那么在幕后会发生什么

(t1, t2, t3) JOIN (SELECT X FROM ... ) t4 ON (t4.X = t1.Y)

如果没有括号,我会得到一个错误:“on子句”中的未知列“t1.Y”。这是有道理的,因为它只是试图加入t3。但是,对于圆括号,它可以工作。

如果您有以下表达式:

from t1,
     t2,
     t3 join
     (select x. . . ) t4
     on t4.X = t1.Y
那么这被解释为:

from t1,
     t2,
     (t3 join
      (select x. . . ) t4
      on t4.X = t1.Y
     )
换句话说,
join
是在逗号之前完成的,因为
join
的优先级高于
(同样的原因是,如果执行10*2+1,则得到11而不是30)。如果将
替换为看似等效的
交叉连接
,则查询将正常工作:

from t1 cross join
     t2 cross join
     t3 join
     (select x. . . ) t4
     on t4.X = t1.Y
这是因为
交叉联接
的优先规则不同于

括号告诉编译器连接的“解释”顺序。因此,当您这样做时:

from (t1, t2, t3) join
     (select X from ... ) t4 on (t4.X = t1.Y)
t1
中的列可用


这个故事的寓意是:不要在
from
子句中使用逗号。始终使用显式连接,即使是对于
交叉连接

有趣的是,在您提供链接的手册页面中都有解释,不是吗?除此之外,在我多年使用sql的工作中,我从未遇到过需要表的笛卡尔积的情况。从来没有。那么,为什么要麻烦呢?这一点非常清楚(比文档更清楚)。谢谢
from (t1, t2, t3) join
     (select X from ... ) t4 on (t4.X = t1.Y)