3 回答
TA贡献1807条经验 获得超9个赞
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个地址和每个城市的地址数量。
TA贡献1865条经验 获得超7个赞
对我来说最重要的一点是:如果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
,否则结果将为空集。
添加回答
举报