为了账号安全,请及时绑定邮箱和手机立即绑定

HAVING和WHERE有什么区别?

HAVING和WHERE有什么区别?

子衿沉夜 2019-08-29 16:36:43
HAVING和WHERE有什么区别?我必须用错误的方式搜索,或者我有一个愚蠢的时刻。声明HAVING和声明之间的区别WHERE是SQL SELECT什么?编辑:我已经将史蒂文的答案标记为正确答案,因为它包含链接上的关键信息:何时GROUP BY不使用,HAVING表现得像一个WHERE条款我见过的WHERE情况没有GROUP BY,也是我的困惑开始的地方。当然,在您知道这一点之前,您无法在问题中指定它。非常感谢所有非常有启发性的答案。
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

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

资源


查看完整回答
反对 回复 2019-08-29
?
函数式编程

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个地址和每个城市的地址数量。


查看完整回答
反对 回复 2019-08-29
?
莫回无

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,否则结果将为空集。


查看完整回答
反对 回复 2019-08-29
  • 3 回答
  • 0 关注
  • 661 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信