MySQL查询/子句执行顺序
在MySQL中执行子句的预定义顺序是什么? 有些是在运行时决定的,这个命令是正确的吗?
FROM clause
-
WHERE clause
-
GROUP BY clause
-
HAVING clause
-
SELECT clause
-
ORDER BY clause
MySQL语句的实际执行有点棘手。 但是,标准确定了查询中元素的解释顺序。 这基本上是按照你指定的顺序,尽pipe我觉得HAVING
和GROUP BY
可以在SELECT
之后出现:
-
FROM
子句 -
WHERE
子句 -
SELECT
子句 -
GROUP BY
子句 -
HAVING
子句 -
ORDER BY
子句
这对了解如何分析查询很重要。 例如,您不能在WHERE
子句中使用SELECT
中定义的列别名,因为在SELECT
之前parsing了WHERE
。 另一方面,这样的别名可以在ORDER BY
子句中。
至于实际的执行,这是真的留给优化者。 例如:
. . . GROUP BY a, b, c ORDER BY NULL
和
. . . GROUP BY a, b, c ORDER BY a, b, c
都具有ORDER BY
根本不被执行的效果 – 所以不会在GROUP BY
之后执行(在第一种情况下,效果是从GROUP BY
移除sorting,在第二个效果是什么也不做比GROUP BY
早)。
我认为执行顺序是这样的:
(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) HAVING <having_condition> (9) ORDER BY <order_by_condition> (10) LIMIT <limit_number>[, <offset_number>]