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>]