HAVING和WHERE有什么区别?

HAVING和WHERE有什么区别?

我必须用错误的方式搜索,或者我有一个愚蠢的时刻。

声明HAVING和声明之间的区别WHERESQL SELECT什么?

编辑:我已经将史蒂文的答案标记为正确答案,因为它包含链接上的关键信息:

何时GROUP BY不使用,HAVING表现得像一个WHERE条款

我见过的WHERE情况没有GROUP BY,也是我的困惑开始的地方。当然,在您知道这一点之前,您无法在问题中指定它。

非常感谢所有非常有启发性的答案。


子衿沉夜
浏览 695回答 3
3回答

青春有我

HAVING指定SELECT语句中使用的组或聚合函数的搜索条件。资源

函数式编程

HAVING:用于在聚合发生后检查条件。WHERE:用于在聚合发生之前检查条件。这段代码:select City, CNT=Count(1)From AddressWhere State = 'MA'Group By City为您提供MA中所有城市的表格以及每个城市的地址数量。这段代码:select City, CNT=Count(1)From AddressWhere State = 'MA'Group By CityHaving Count(1)>5为您提供MA的城市表格,其中包含超过5个地址和每个城市的地址数量。

莫回无

对我来说最重要的一点是:如果HAVING从SQL语言中删除,那么生活会像以前一样或多或少地继续下去。当然,少数查询需要使用派生表,CTE等进行重写,但结果可能更容易理解和维护。也许供应商的优化程序代码需要重写才能解决这个问题,这也是行业内部改进的机会。现在考虑WHERE从语言中删除一下。这一次,现有的大多数查询都需要在没有明显替代构造的情况下进行重写。编码器必须具有创造性,例如内连接到已知包含恰好一行的表(例如DUAL在Oracle中),使用该ON子句来模拟先前WHERE子句。这样的结构将是人为的; 很明显,语言中缺少某些内容,因此情况会更糟。TL; DR我们HAVING明天可能输了,事情不会更糟,可能更好,但同样不能说WHERE。从这里的答案来看,似乎很多人都没有意识到一个HAVING条款可以在没有条款的情况下使用GROUP BY。在这种情况下,该HAVING子句将应用于整个表表达式,并且只需要在SELECT子句中出现常量。通常,该HAVING条款将涉及聚合。这比听起来更有用。例如,请考虑此查询以测试该name列是否对于以下所有值都是唯一的T:SELECT 1 AS result   FROM THAVING COUNT( DISTINCT name ) = COUNT( name );只有两种可能的结果:如果HAVING子句为true,则结果为包含该值的单行1,否则结果将为空集。
打开App,查看更多内容
随时随地看视频慕课网APP