SQL order by,group by,distinct和aggregation function的流程顺序?

时间:2014-12-02 04:32:18

标签: mysql sql aggregate-functions aggregate aggregation

查询如下:

SELECT DISTINCT max(age), area FROM T_USER GROUP BY area ORDER BY area;

那么,order by,group by,distinct和aggregation function的流程顺序是什么?

也许不同的顺序会得到相同的结果,但会导致不同的表现。我想合并多个结果,我得到了sql,并进行了解析。所以我想知道标准sql剂量的顺序。

1 个答案:

答案 0 :(得分:1)

这比group by / aggregation / order by更大。您希望了解查询引擎如何创建结果集。在较高级别,这意味着创建执行计划,从表中检索数据到查询的工作集,操纵数据以匹配请求的结果集,然后将结果集返回给调用者。对于非常简单的查询或与表设计匹配的查询(或者为您需要运行的查询精心设计的表模式),这可能意味着将表或索引中的数据流直接返回给调用者。更常见的是,它意味着更详细的思考,大致按照以下步骤进行思考:

  1. 查看查询以确定需要哪些表。
  2. 查看联接和子查询,以确定哪些表依赖于其他表。
  3. 查看连接和where子句中的条件,结合索引,确定每个表需要多少空间,以及提取每个表的部分所需的工作量需要(查询与您的索引或存储在磁盘上的表匹配的程度如何)。
  4. 根据从步骤1到3 收集的信息,找出检索选择列表所需数据的最有效方法,无论查询中包含哪些表的顺序如何任何ORDER BY子句。对于此步骤,“最有效”被定义为尽可能长时间保持工作集尽可能小的方法。
  5. 开始迭代步骤4指示的记录。如果存在GROUP BY子句,则必须先针对现有已发现的组检查每条记录,然后引擎才能确定是否应在工作中生成新行组。通常,最有效的方法是让查询引擎在此处执行有效的ORDER BY步骤,以便将结果的所有潜在行实现到工作集中,然后由GROUP BY中的列对其进行排序。子句,并精简,以便只删除重复的行。当发现该组的记录时,每个组的聚合函数结果都会更新
  6. 一旦所有指定的记录都具体化,以便知道任何聚合函数的结果,就可以评估HAVING子句。
  7. 现在,最后,ORDER BY也可以被考虑在内。
  8. 工作集中剩余的记录将返回给调用者。
  9. 虽然那很复杂,但这只是一个开始。它不会开始考虑窗口函数,公用表表达式,交叉应用,数据透视和打开等。但是,希望能够让您了解数据库引擎需要做的工作。