题
我一定是以错误的方式搜索的,或者我正处于一个愚蠢的时刻。
有什么区别 HAVING
和 WHERE
在一个 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。
参考
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
未使用,则 WHERE
和 HAVING
子句本质上是等价的。
然而,当 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
在处理项目时,这也是我的问题。如上所述, 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
可能仅仅是“何处”的主题。是一行,而“有”的主题是是一个团体。我是对的吗?