在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在GROUP BY之前;SQL在对记录进行分组之前计算WHERE子句。 HAVING继GROUP BY之后;SQL在对记录进行分组后计算HAVING。
参考文献
SQLite SELECT语句语法/铁路图 Informix SELECT语句语法/铁路图
其他回答
从这里。
SQL标准要求HAVING 中的列必须只引用 中使用的GROUP BY子句或列 聚合函数
而不是应用于数据库行的WHERE子句
在做项目的时候,这也是我的问题。如上所述,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
我使用HAVING来约束基于聚合函数结果的查询。例如:select * in blahblahblah group by SOMETHING having count(SOMETHING)>0
在聚合查询中(使用聚合函数的任何查询),Where子句中的谓词在生成聚合中间结果集之前求值,
Having子句中的谓词在聚合结果集生成后应用于聚合结果集。这就是为什么聚合值的谓词条件必须放在Having子句中,而不是放在Where子句中,以及为什么可以在Having子句中使用Select子句中定义的别名,而不能在Where子句中使用。
的搜索条件 group或在SELECT语句中使用的聚合函数。
源