在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语句语法/铁路图
其他回答
对我来说,第一个区别是:如果HAVING从SQL语言中移除,那么生活将或多或少地像以前一样。当然,少数查询需要使用派生表、CTE等重新编写,但它们可能会因此更容易理解和维护。也许供应商的优化器代码需要重新编写,以考虑到这一点,这又是一个行业内改进的机会。
Now consider for a moment removing WHERE from the language. This time the majority of queries in existence would need to be rewritten without an obvious alternative construct. Coders would have to get creative e.g. inner join to a table known to contain exactly one row (e.g. DUAL in Oracle) using the ON clause to simulate the prior WHERE clause. Such constructions would be contrived; it would be obvious there was something was missing from the language and the situation would be worse as a result.
我们可能失去明天的“拥有”,情况不会更糟,甚至可能更好,但“在哪里”就不一定了。
从这里的答案来看,许多人似乎没有意识到HAVING子句可以在没有GROUP BY子句的情况下使用。在本例中,HAVING子句应用于整个表表达式,并要求SELECT子句中只出现常量。通常,HAVING子句将涉及聚合。
这比听起来更有用。例如,考虑这个查询来测试name列是否对T中的所有值都是唯一的:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
只有两种可能的结果:如果HAVING子句为真,则结果为包含值1的单行,否则结果为空集。
在做项目的时候,这也是我的问题。如上所述,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
从这里。
SQL标准要求HAVING 中的列必须只引用 中使用的GROUP BY子句或列 聚合函数
而不是应用于数据库行的WHERE子句
我使用HAVING来约束基于聚合函数结果的查询。例如:select * in blahblahblah group by SOMETHING having count(SOMETHING)>0
一种理解方法是,having子句是where子句的附加过滤器。
WHERE子句用于从结果中过滤记录。筛选器发生在任何分组之前。HAVING子句用于从组中筛选值