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

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

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

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


当前回答

在做项目的时候,这也是我的问题。如上所述,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子句是where子句的附加过滤器。

WHERE子句用于从结果中过滤记录。筛选器发生在任何分组之前。HAVING子句用于从组中筛选值

HAVING在使用聚合(例如GROUP BY)时使用。

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

当GROUP BY不使用时,WHERE和HAVING子句本质上是等价的。

然而,当使用GROUP BY时:

WHERE子句用于从结果中筛选记录。的 在进行任何分组之前进行筛选。 HAVING子句用于从一个组(即到 执行分组聚合后检查条件)。

来自这里的资源

我使用HAVING来约束基于聚合函数结果的查询。例如:select * in blahblahblah group by SOMETHING having count(SOMETHING)>0

WHERE用于对SQL返回的集合进行限制;它使用SQL内置的集合操作和索引,因此是过滤结果集的最快方式。尽可能使用WHERE。

have对于某些聚合过滤器是必要的。它在sql检索、组装和排序结果之后过滤查询。因此,它比WHERE慢得多,应该避免,除非在需要它的情况下。

SQL Server将允许您使用HAVING,即使WHERE更快。不要这样做。