sqlite - 当我们已经有了 WHERE 子句时,HAVING 子句有什么用?
问题描述
SQLite 初学者在这里。
我正在学习 SQLite 中的 GROUP BY 和 HAVING 子句。我知道 GROUP BY 子句的用途。而且我知道 HAVING 子句应用于 GROUP BY 子句返回的组。但是当我们有 WHERE 子句时,真的有必要使用它吗?
例如:我有一个名为 sales 的表,其中包含以下内容:
id item_name price month
---------- ---------- ---------- ----------
1 Bike 500.0 October
2 Hammer 25.0 October
3 Rope 50.0 November
4 Screw 10.0 November
这个查询:
SELECT month,count(*) FROM sales WHERE price > 35 GROUP BY month;
和这个:
SELECT month,count(*) FROM sales WHERE price > 35 GROUP BY month HAVING (price > 35);
返回相同的结果。我想知道我是否没有将 HAVING 子句用于其设计的确切目的。因为我运行了另一组查询:
SELECT month,count(*) FROM sales GROUP BY month HAVING (price > 35);
SELECT month,count(*) FROM sales WHERE price > 35 GROUP BY month HAVING (price > 35);
他们都返回不同的答案。
感谢您提供的任何帮助。
解决方案
如果您再添加一个功能,您会注意到不同之处sum(price)
:
select
month
, count(*)
, sum(price)
from sales
where price > 35
group by month
;
这首先过滤数据(withwhere
子句),然后将其分组。由于它在过滤后分组,因此count(*)
给出 1。
然而
select
month
, count(*)
, sum(price)
from sales
group by month
having price > 35
;
在未过滤的数据(无where
子句)上运行,但sum
仅对having price > 35
. 由于它在未过滤的数据上运行,因此count(*)
给出 2。
推荐阅读
- r - 具有interactive=TRUE的ggRadar不能改变颜色
- windows - 如何从 Windows 下的服务代码中枚举活动的音频会话?
- c# - 如何在 NUnit 中模拟 StreamReader
- c# - 我正在使用 C# 将 XML 文件转换为 CSV。我尝试了不同的方法,但无法弄清楚如何访问键名/值对
- list - 带有日志插入和日志搜索的索引列表
- python - Python中的克拉克埃文斯聚合索引
- linux - 变量内的位置参数不可读 - bash脚本
- xcode - 如何更改 iOS 设备的 Safari 扩展程序的显示名称?
- flutter - 如何用颤振创造这种效果。我使用了 BackdropFilter 但我认为它不正确
- html - 不使用 CSS 扩展选择器