使用having子句和where子句之间的区别

时间:2011-06-24 11:41:02

标签: sql sql-server-2008

  

可能重复:
  SQL: What's the difference between HAVING and WHERE?

使用having子句和where子句有什么区别。任何人都可以详细解释。

9 个答案:

答案 0 :(得分:2)

HAVING过滤器分组元素, WHERE过滤未分组的元素。

示例1:

 SELECT col1, col2 FROM table
 WHERE col1 = @id

示例2:

 SELECT SUM(col1), col2 FROM table
 GROUP BY col2
 HAVING SUM(col1) > 10

因为HAVING条件只能在分组发生后的第二个例子中应用,所以不能将其重写为WHERE子句。

示例3:

 SELECT SUM(col1), col2 FROM table
 WHERE col1 = @id
 GROUP BY col2
 HAVING SUM(col1) > 10

演示了如何同时使用WHERE和HAVING:

表格数据首先按col1 = @id过滤 然后将过滤后的数据分组 然后,SUM(col1) > 10

再次过滤分组数据

答案 1 :(得分:1)

WHERE filters rows before they are grouped in GROUP BY clause 
while HAVING filters the aggregate values after GROUP BY takes place

答案 2 :(得分:1)

HAVING指定搜索SELECT语句中使用的内容。

换句话说。

HAVING适用于群组。

WHERE适用于行。

答案 3 :(得分:1)

没有GROUP BY,没有区别(但HAVING看起来很奇怪)

使用GROUP BY

  • HAVING用于测试聚合上的条件(MAX,SUM,COUNT等)
  • HAVING column = 1WHERE column = 1相同(column上没有聚合)
  • WHERE COUNT(*) = 1是不允许的。
  • 允许
  • HAVING COUNT(*) = 1

答案 4 :(得分:0)

具有聚合函数,例如

SELECT * 
FROM foo
GROUP BY baz
HAVING COUNT(*) > 8

答案 5 :(得分:0)

Having适用于Sum等聚合。 Where适用于所有其他情况。

答案 6 :(得分:0)

它们指定组或聚合的搜索条件。但不同之处在于HAVING只能与SELECT语句一起使用。 HAVING通常用于GROUP BY子句。不使用GROUP BY时,HAVING的行为类似于WHERE子句。 Clause基本上只用于查询中的GROUP BY函数,而WHERE子句在它们是查询中GROUP BY函数的一部分之前应用于每一行。

答案 7 :(得分:0)

正如其他已经说过的那样,已经和group by一起使用了。原因是执行顺序 - 在分组之前执行,在执行之后执行

答案 8 :(得分:0)

将其视为过滤发生的位置。

当您指定where子句时,您将输入行过滤到您的聚合函数(即:我只想获得居住在特定城市的人的平均年龄。)当您指定having时约束,您指定只需要平均值的某个子集。 (我只希望看到平均年龄为70岁或以上的城市。)