无法理解WHERE子句被接受的原因

时间:2013-03-12 20:32:19

标签: sql sql-server database sql-server-2008

我试图理解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吗?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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或更少的销售商店。]