连接顺序是否在SQL(特定于MySQL)中起作用 - FROM子句中的NOT表

时间:2017-05-04 12:27:53

标签: mysql sql join

这不是this Q&A的重复,因为此处的问题和答案涉及FROM子句中提到的表格。我的不是。

假设FROM子句中的表总是相同的,我永远不会改变它。我添加联接的顺序是否重要?

我正在使用内部构建的查询构建器。 (是的我知道那里已经有了一些东西,但这个问题超出了范围)。

我希望能够在我的脚本开头设置一些连接,稍后根据条件设置一些连接,查询构建器会从上到下将它们添加到查询中。无论在查询中的顺序如何,SQL引擎都会优化连接的顺序吗?

示例:

SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A 
INNER JOIN table2 B
    ON B.a_id = A.id
LEFT JOIN table3 C 
    ON C.id = A.c_id
LEFT JOIN table4 D 
    ON D.id = C.d_id;

SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A 
LEFT JOIN table4 D 
    ON D.id = C.d_id
INNER JOIN table2 B
    ON B.a_id = A.id
LEFT JOIN table3 C 
    ON C.id = A.c_id;

在这里你可以看到我已经在连接之前为table4 D声明了连接,因为它的依赖表是在脚本(C)中声明的。这有关系吗?

1 个答案:

答案 0 :(得分:2)

简单回答:不能在声明对象之前引用表对象/别名。

mySQL会在第二次查询时抛出错误。 `未知栏' C.d_id'在' on条款'

所以是的......编译器没有预见到它是否稍后被引用..它只知道订单然后它试图找出哪种加入方法最好。

SQLFiddle

*解决以下问题:无论如何,SQL引擎是否会优化连接的顺序,而不管它们在查询中的顺序如何? *

是的,它会优化订单;但是" FROM"在声明表格或查询无法编译之前,订单不能包含对表格的引用。 (例如,参见上面的错误和链接)