在SQL SELECT语句中,HAVING和WHERE的区别是什么?
编辑:我已经把Steven的答案标记为正确答案,因为它包含了链接上的关键信息:
当GROUP BY没有被使用时,HAVING就像一个WHERE子句
我在WHERE中看到的情况没有GROUP BY,这就是我的困惑开始的地方。当然,在你知道这一点之前,你不能在问题中指定它。
在SQL SELECT语句中,HAVING和WHERE的区别是什么?
编辑:我已经把Steven的答案标记为正确答案,因为它包含了链接上的关键信息:
当GROUP BY没有被使用时,HAVING就像一个WHERE子句
我在WHERE中看到的情况没有GROUP BY,这就是我的困惑开始的地方。当然,在你知道这一点之前,你不能在问题中指定它。
当前回答
当GROUP BY不使用时,WHERE和HAVING子句本质上是等价的。
然而,当使用GROUP BY时:
WHERE子句用于从结果中筛选记录。的 在进行任何分组之前进行筛选。 HAVING子句用于从一个组(即到 执行分组聚合后检查条件)。
来自这里的资源
其他回答
两者之间的区别在于与GROUP BY子句的关系:
WHERE在GROUP BY之前;SQL在对记录进行分组之前计算WHERE子句。 HAVING继GROUP BY之后;SQL在对记录进行分组后计算HAVING。
参考文献
SQLite SELECT语句语法/铁路图 Informix SELECT语句语法/铁路图
HAVING在使用聚合(例如GROUP BY)时使用。
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
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;
我遇到了一个问题,并发现了WHERE和HAVING之间的另一个区别。它对索引列的作用不同。
WHERE my_indexed_row = 123将显示行,并自动对其他索引行执行“ORDER ASC”。
HAVING my_indexed_row = 123显示从最老的“插入”行到最新的行,没有顺序。
WHERE子句不适用于聚合函数 意思是:你不应该这样使用 附赠:表名
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
不要用WHERE从句,而要用HAVING..
如果不使用GROUP BY子句,HAVING子句就相当于WHERE子句
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200