HAVING和WHERE有什么区别?

时间:2008-11-13 16:46:12

标签: sql where having

我一定是在用错误的方式搜索,或者我有一个愚蠢的时刻。

HAVING声明中WHERESQL SELECT之间的区别是什么?

编辑:我已将史蒂文的答案标记为正确答案,因为它包含链接上的关键信息:

  

如果未使用GROUP BY,则HAVING的行为类似于WHERE条款

我见过WHERE的情况没有GROUP BY,而且我的困惑开始了。当然,在你知道这一点之前,你无法在问题中指明它。

非常感谢所有非常有启发性的答案。

20 个答案:

答案 0 :(得分:335)

HAVING:用于在聚合发生后检查条件 WHERE:用于在聚合发生之前检查条件

此代码:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

为您提供MA中所有城市的表格以及每个城市的地址数量。

此代码:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

为您提供MA的城市表格,其中包含超过5个地址和每个城市的地址数量。

答案 1 :(得分:87)

  

HAVING指定a的搜索条件   SELECT或SELECT语句中使用的聚合函数。

Source

答案 2 :(得分:26)

对我来说,第一个区别是:如果从SQL语言中删除了HAVING,那么生活会像以前一样或多或少地继续下去。当然,少数查询需要使用派生表,CTE等进行重写,但结果可能更容易理解和维护。也许供应商的优化程序代码需要重写才能解决这个问题,这也是行业内部改进的机会。

现在考虑从语言中删除WHERE。这次存在的多数查询需要在没有明显替代构造的情况下进行重写。编码器必须具有创造性,例如内联接到一个已知只包含一行的表(例如Oracle中的DUAL),使用ON子句来模拟先前的WHERE子句。这样的结构将是人为的;很明显,语言中缺少某些东西,因此情况会更糟。

TL; DR我们明天可能会失去HAVING而且情况可能会更糟,可能更好,但WHERE也不能说。


从这里的答案来看,似乎许多人没有意识到在没有HAVING条款的情况下可以使用GROUP BY子句。在这种情况下,HAVING子句将应用于整个表表达式,并且只需要在SELECT子句中出现常量。通常,HAVING子句将涉及聚合。

这比听起来更有用。例如,请考虑此查询以测试name列对T中的所有值是否唯一:

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

只有两种可能的结果:如果HAVING子句为true,则结果为包含值1的单行,否则结果将为空集。

答案 3 :(得分:21)

HAVING子句已添加到SQL,因为WHERE关键字不能与聚合函数一起使用。

查看此w3schools link以获取更多信息

语法:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

这样的查询:

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

...可以使用派生表重写(并省略HAVING),如下所示:

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;

答案 4 :(得分:21)

两者之间的区别在于与GROUP BY子句的关系:

  • GROUP BY之前的地方; SQL在对记录进行分组之前评估WHERE子句。

  • HADING来自GROUP BY; SQL在对记录进行分组后评估HAVING。

select statement diagram

<强>参考

答案 5 :(得分:12)

当您使用HAVING等聚合时,会使用

GROUP BY

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

答案 6 :(得分:8)

WHERE应用于SQL返回的集合的限制;它使用SQL的内置集合操作和索引,因此是过滤结果集的最快方法。始终尽可能使用WHERE。

某些聚合滤镜需要HAVING。它在sql检索,汇编和排序结果后过滤查询。因此,它比WHERE慢得多,应该避免,除非在那些需要它的情况下。

即使WHERE速度更快,SQL Server也可以让您使用HAVING。不要这样做。

答案 7 :(得分:6)

WHERE子句不适用于聚合函数
意思是:你不应该这样使用 奖金:表名

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

HERE而不是使用WHERE子句,你必须使用HAVING ..

不使用GROUP BY子句,HAVING子句只作为WHERE子句

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  

答案 8 :(得分:4)

差异b / w WHEREHAVING条款:

WHEREHAVING子句之间的主要区别在于,WHERE用于行操作,HAVING用于列操作。

为什么我们需要HAVING条款?

众所周知,聚合函数只能在列上执行,因此我们不能在WHERE子句中使用聚合函数。因此,我们在HAVING子句中使用聚合函数。

答案 9 :(得分:3)

如果未使用GROUP BY,则WHEREHAVING条款基本相同。

但是,当使用GROUP BY时:

  • WHERE子句用于过滤结果中的记录。该 在进行任何分组之前进行过滤。
  • HAVING子句用于过滤组中的值(即,到 检查聚合成组后的条件。)

来自Here

的资源

答案 10 :(得分:2)

我遇到了问题,发现WHEREHAVING之间存在其他差异。它在索引列上的行为方式不同。

WHERE my_indexed_row = 123将显示行并自动在其他索引行上执行“ORDER ASC”。

HAVING my_indexed_row = 123显示从最旧的“插入”行到最新行的所有内容,无需排序。

答案 11 :(得分:1)

在聚合查询中,(任何使用聚合函数的查询)在生成聚合中间结果集之前评估where子句中的谓词,

Have子句中的谓词在生成后应用于聚合结果集。这就是为什么聚合值的谓词条件必须放在Having子句中,而不是放在Where子句中,以及为什么你可以在Having子句中使用Select子句中定义的别名,而不是在Where子句中。

答案 12 :(得分:1)

WHERE子句用于比较基表中的值,而HAVING子句可用于过滤查询结果集中的聚合函数的结果 点击here

答案 13 :(得分:1)

考虑它的一种方法是having子句是where子句的附加过滤器。

使用 WHERE 子句过滤结果中的记录。过滤器在进行任何分组之前进行。 HAVING 子句用于过滤组中的值

答案 14 :(得分:0)

在处理项目时,这也是我的问题。如上所述, HAVING 检查已找到的查询结果的条件。但是 WHERE 用于在查询运行时检查条件。

让我举一个例子来说明这一点。假设你有一个像这样的数据库表。

  

usertable {int userid,date datefield,int dailyincome}

假设,表格中包含以下行:

  

1,2011-05-20,100

     

1,2011-05-21,50

     

1,2011-05-30,10

     

2,2011-05-30,10

     

2,2011-05-20,20

现在,我们希望获得useridsum(dailyincome) sum(dailyincome)>100

如果我们写:

  

SELECT userid,sum(dailyincome)FROM usertable WHERE   sum(dailyincome)&gt; 100 GROUP BY userid

这将是一个错误。正确的查询是:

  

SELECT userid,sum(dailyincome)FROM usertable GROUP BY userid HAVING   总和(dailyincome)→100

答案 15 :(得分:0)

当不使用GROUP BY时,WHERE和HAVING子句实质上是等效的。

但是,当使用GROUP BY时:

  • WHERE子句用于从结果中过滤记录。的 过滤会在进行任何分组之前进行。
  • HAVING子句是 用于过滤组中的值(即检查 已进行分组汇总。)

答案 16 :(得分:0)

可能只是“where”的主题是一行,而“having”的主题是一组。我是对的吗?

答案 17 :(得分:0)

来自here

  

SQL标准要求HAVING   必须只引用中的列   GROUP BY子句或列中使用的   聚合函数

,而不是应用于数据库行的WHERE子句

答案 18 :(得分:0)

我使用HAVING根据聚合函数的结果来约束查询。例如。选择*在blahblahblah组由SOMETHING计数(SOMETHING)&gt; 0

答案 19 :(得分:-1)

Where子句用于从整个数据库中筛选出行。但是,Having子句用于从特定的数据库组中过滤出行。 Have子句还可以帮助汇总功能,例如最小/最大/平均

有关更多详细信息。 what's the difference between WHERE and HAVING what is the difference between WHERE and HAVING