Mysql 当表引用被包装在括号中(在联接前面)时会发生什么?
联接语法操作单个表引用(来自MySQL文档:): 如果我将多个表引用放在括号内并将其用作“table_引用”,那么在幕后会发生什么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
(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)