代码之家  ›  专栏  ›  技术社区  ›  Evan

MySQL操作顺序?

  •  3
  • Evan  · 技术社区  · 14 年前

    是否有一个确定的地方可以找到mySQL语句的操作顺序?下面的顺序正确吗?

    从句 WHERE子句 按子句分组 有从句 SELECT子句 按条款订货

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

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  3
  •   Adam Byrtek    14 年前

    我想你对 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 条款。

        2
  •  0
  •   KeithS    14 年前

    我认为Order By优先于Select(您可以对尚未选择的列进行排序),但是groupby和havingdeat肯定是最后一个分组需要了解整个结果集,并且只能对“选择”列表中的非聚合列进行分组(并且必须对所有列进行分组)。结果集分组后,Having作为一组条件应用于分组的结果集。

    因此,我认为大多数引擎,包括MySQL,都是按如下方式处理的:

    • 定义域源(FROM子句包括联接)
    • 过滤器(位置)
    • 排序(ORDER BY)
    • 项目(选择)
    • 分组(分组)
    • 再次过滤(有)