MySQL查询/子句执行顺序

在MySQL中执行子句的预定义顺序是什么? 有些是在运行时决定的,这个命令是正确的吗?

  • FROM clause
  • WHERE clause
  • GROUP BY clause
  • HAVING clause
  • SELECT clause
  • ORDER BY clause

MySQL语句的实际执行有点棘手。 但是,标准确定了查询中元素的解释顺序。 这基本上是按照你指定的顺序,尽pipe我觉得HAVINGGROUP 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>]