我一定是以错误的方式搜索的,或者我正处于一个愚蠢的时刻。

有什么区别 HAVINGWHERE 在一个 SQL SELECT 陈述?

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

什么时候 GROUP BY 未使用, HAVING 行为就像 WHERE 条款

我所看到的情况 WHERE 在没有 GROUP BY 这就是我困惑的开始。当然,在您知道这一点之前,您无法在问题中指定它。

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

有帮助吗?

解决方案

  

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

来源

其他提示

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个地址和每个城市的地址数量。

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

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

TL; DR明天我们可能会丢失 HAVING ,事情就不会变得更糟,可能更好,但 WHERE 也是如此。


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

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

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

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

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

查看此 w3schools链接了解更多信息

语法:

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;

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

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

  • HAVING 出现在 GROUP BY 之后;SQL 在对记录进行分组后评估 HAVING。

select statement diagram

参考

当您使用 GROUP BY 等聚合时,会使用

HAVING

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

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

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

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

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  

差异b / w WHERE HAVING 子句:

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

为什么我们需要 HAVING 子句?

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

什么时候 GROUP BY 未使用,则 WHEREHAVING 子句本质上是等价的。

然而,当 GROUP BY 用来:

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

资源来自 这里

我遇到了问题,发现 WHERE HAVING 之间存在另一个区别。它在索引列上的行为方式不同。

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

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

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

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

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

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

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

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

此处

  

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

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

在处理项目时,这也是我的问题。如上所述, 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

现在,我们希望得到 userid sum(dailyincome),其 sum(dailyincome)&gt; 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

可能仅仅是“何处”的主题。是一行,而“有”的主题是是一个团体。我是对的吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top