Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 对查询结果进行汇总、分组和排序 » GROUP BY 子句:将查询结果划分为组

 

具有 GROUP BY 的查询是如何执行的

本节在说明和示例中使用 GROUP BY 子句的 ROLLUP 从属子句。有关 ROLLUP 子句的详细信息,请参见使用 ROLLUP 和 CUBE 作为 GROUPING SETS 的快捷方式

假设有一个以下形式的单表查询:

SELECT select-list
   FROM table
   WHERE where-search-condition
   GROUP BY [ group-by-expression | ROLLUP (group-by-expression) ]
   HAVING having-search-condition

该查询的执行方式如下:

  1. 应用 WHERE 子句

    这就生成只包含该表的某些行的中间结果。

    该中间结果包含此表中行的子集。
  2. 将结果划分为若干个组

    此操作按 GROUP BY 子句的要求生成一个中间结果,结果中的每一行对应一组。生成的每一行都包含对应于一个组的 group-by-expression,并包含 select-listhaving-search-condition 中已计算完的集合函数。

    通过应用 GROUP BY 子句使第二个中间结果变小。
  3. 应用任何 ROLLUP 操作

    将作为 ROLLUP 操作的一部分计算的分类汇总行添加到结果集中。

  4. 应用 HAVING 子句

    此时,此第二个中间结果中的不满足 HAVING 子句条件的所有行都将被删除。

  5. 将结果投影到显示屏中

    此操作只从第 3 步获取需要在查询的结果集中显示的那些列,也就是说,它只获取与 select-list 中的表达式相对应的那些列。

    最终结果集是第二个中间结果集的投影。

此过程对带有 GROUP BY 子句的查询有如下要求:

  • 首先计算 WHERE 子句。因此,将只对满足 WHERE 子句条件的那些行计算集合函数。

  • 最终结果集是根据第二个中间结果(保存已划分的行)建立的。第二个中间结果保留与 group-by-expression 相对应的那些行。因此,如果一个非集合函数的表达式出现在 select-list 中,则该表达式也必须出现在 group-by-expression 中。在投影步骤中无法执行函数计算。

  • 可以在 group-by-expression 中包含表达式,但不能在 select-list 中包含表达式。它被投影到结果之外。