在SQL SELECT语句中,HAVING和WHERE的区别是什么?

编辑:我已经把Steven的答案标记为正确答案,因为它包含了链接上的关键信息:

当GROUP BY没有被使用时,HAVING就像一个WHERE子句

我在WHERE中看到的情况没有GROUP BY,这就是我的困惑开始的地方。当然,在你知道这一点之前,你不能在问题中指定它。


当前回答

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  

其他回答

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

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

用户表{int用户id,日期日期字段,int每日收入}

假设,表中有以下行:

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

现在,我们希望获得用户id和sum(dailyincome),其sum(dailyincome)为>100

如果我们这样写:

SELECT usertable WHERE WHERE用户id, sum(dailyincome sum(dailyincome)>100 GROUP BY userid

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

SELECT userid, sum(dailyincome) FROM usertable GROUP BY userid HAVING sum (dailyincome) > 100

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

WHERE在GROUP BY之前;SQL在对记录进行分组之前计算WHERE子句。 HAVING继GROUP BY之后;SQL在对记录进行分组后计算HAVING。

参考文献

SQLite SELECT语句语法/铁路图 Informix SELECT语句语法/铁路图

的搜索条件 group或在SELECT语句中使用的聚合函数。

我遇到了一个问题,并发现了WHERE和HAVING之间的另一个区别。它对索引列的作用不同。

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

HAVING my_indexed_row = 123显示从最老的“插入”行到最新的行,没有顺序。

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