4

我试图了解 HAVING 和 WHERE 之间的区别。我知道这HAVING与 GROUP BY 语句一起使用。但是,我不明白为什么接受以下声明:

select SUM(child_id) from children WHERE child_ID = 5 GROUP BY Child_ID

不应该是正确的说法select SUM(child_id) from children GROUP BY Child_ID HAVING child_ID = 5吗?

4

2 回答 2

6

WHERE 子句在分组过程发生之前执行,并且只能访问输入表中的字段。HAVING 在分组过程发生后执行,可以根据分组过程中计算的聚合值的值过滤结果。

于 2013-03-12T20:37:01.923 回答
2

即使使用了 HAVING,也可以使用 WHERE 子句。它们的含义非常不同。思考的方法如下:

  • WHERE 子句充当记录级别的过滤器
  • 然后将通过的任何内容放入您的 GROUP BY 指定的组中
  • 然后,HAVING 子句根据聚合(SUM、COUNT、MIN 等)条件过滤掉组

所以,如果我有一张桌子:(STORE_ID,STATE_CODE,SALES)

Select STATE, SUM(SALES)
from MyTable
Where SALES > 100
Group By STATE
Having Sum(Sales) > 1000

这将首先过滤以仅读取销售额超过 100 的商店记录。对于每个组(按州),它将仅汇总销售额为 100 或更多的商店的销售额。然后,它将丢弃任何州,除非州级总和超过 1000。[注:州总和不包括任何销售额 100 或以下的商店。]

于 2013-03-12T20:40:38.670 回答