MySQL运营顺序?

时间:2010-10-22 21:43:17

标签: mysql

是否有确定的地方可以找到mySQL语句的操作顺序?以下订单是否正确?

FROM子句 WHERE子句 GROUP BY子句 HAVING子句 SELECT子句 ORDER BY子句

如果是这种情况,我可以在group by子句中使用SELECT clase中定义的术语(选择first_name作为“f_name”)吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

我假设您对SELECT感兴趣,根据MySQL documentation语法如下

SELECT
[ALL | DISTINCT | DISTINCTROW ]
  [HIGH_PRIORITY]
  [STRAIGHT_JOIN]
  [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
  [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
  [ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
  [ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]

是的,您可以在AS子句中使用GROUP BY定义的列。

答案 1 :(得分:0)

我认为Order By在Select之前出现(你可以对你没有选择的列进行排序),但是Group By和Having肯定会死掉。分组需要了解整个结果集,并且您只能对“选择”列表中的非聚合列进行分组(并且必须对所有这些列进行分组)。将结果集分组后,将Having作为一组条件应用于分组结果集。

所以,我认为大多数引擎,包括MySQL,处理如下:

  • 定义域源(包含JOIN的FROM子句)
  • 过滤器(WHERE)
  • 排序(ORDER BY)
  • 项目(SELECT)
  • 组(GROUP BY)
  • 再次过滤(HAVING)