SQL Server中Group By,Having和Where子句的执行顺序是什么?

83 sql sql-server sql-server-2005

当我们使用GROUP BY和HAVING与WHERE子句时,我只是混淆了SQL查询的执行顺序.先执行哪一个?什么是序列?

KM.*_*KM. 169

为了:

FROM&JOIN ■确定与过滤器的行
WHERE行上多个滤波器
GROUP BY结合的那些行成组
HAVING滤波器组
ORDER BY排列其余的行/组
LIMIT上剩余的行/组过滤器

  • 简洁而翔实.保持良好的工作!+1 (3认同)
  • @葛山,看看“ SET SHOWPLAN_ALL ON” (2认同)
  • 选择条款怎么样。是在最后吗? (2认同)

Kus*_*era 11

这是查询执行的 SQL 顺序,

在此输入图像描述

您可以使用本文中的示例检查执行顺序。

对于您的问题,以下几行可能会有所帮助,并且直接从本文中获得

  1. GROUP BY --> 应用 WHERE 约束后的剩余行将根据 GROUP BY 子句中指定的列中的公共值进行分组。分组的结果是,行数与该列中的唯一值一样多。隐含地,这意味着您应该只在查询中有聚合函数时才需要使用它。
  1. HAVING --> 如果查询有 GROUP BY 子句,则 HAVING 子句中的约束将应用于分组行,丢弃不满足约束的分组行。与 WHERE 子句一样,在大多数数据库中也无法通过此步骤访问别名。

参考:-


Md.*_*bir 9

这是sql server的完整序列:

1.  FROM
2.  ON
3.  JOIN
4.  WHERE
5.  GROUP BY
6.  WITH CUBE or WITH ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY
11. TOP
Run Code Online (Sandbox Code Playgroud)

因此,从上面的列表中,您可以很容易地理解其执行顺序GROUP BY, HAVING and WHERE是:

1.  WHERE
2.  GROUP BY
3.  HAVING
Run Code Online (Sandbox Code Playgroud)

从Microsoft获取有关它的更多信息


Mat*_*eid 7

首先,然后您对查询结果进行GROUP,最后但并非最不重要的是采用HAVING子句来过滤分组结果.这是"逻辑"顺序,我不知道这是如何在引擎中技术实现的.

  • 值得补充的是,如果不依赖于聚合,优化器可以将子句从HAVING移动到WHERE.这不会影响显示的结果. (2认同)