我一定是在用错误的方式搜索,或者我有一个愚蠢的时刻。
HAVING
声明中WHERE
和SQL SELECT
之间的区别是什么?
如果未使用
GROUP BY
,则HAVING
的行为类似于WHERE
条款
我见过WHERE
的情况没有GROUP BY
,而且我的困惑开始了。当然,在你知道这一点之前,你无法在问题中指明它。
非常感谢所有非常有启发性的答案。
答案 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语句中使用的聚合函数。
答案 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。
<强>参考强>
答案 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 WHERE
和HAVING
条款:
WHERE
和HAVING
子句之间的主要区别在于,WHERE
用于行操作,HAVING
用于列操作。
为什么我们需要HAVING
条款?
众所周知,聚合函数只能在列上执行,因此我们不能在WHERE
子句中使用聚合函数。因此,我们在HAVING
子句中使用聚合函数。
答案 9 :(得分:3)
如果未使用GROUP BY
,则WHERE
和HAVING
条款基本相同。
但是,当使用GROUP BY
时:
WHERE
子句用于过滤结果中的记录。该
在进行任何分组之前进行过滤。HAVING
子句用于过滤组中的值(即,到
检查聚合成组后的条件。)来自Here
的资源答案 10 :(得分:2)
我遇到了问题,发现WHERE
和HAVING
之间存在其他差异。它在索引列上的行为方式不同。
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
现在,我们希望获得userid
和sum(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时:
答案 16 :(得分:0)
可能只是“where”的主题是一行,而“having”的主题是一组。我是对的吗?
答案 17 :(得分:0)
答案 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