首页 > 解决方案 > 当我们已经有了 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);

他们都返回不同的答案。

感谢您提供的任何帮助。

标签: sqlite

解决方案


如果您再添加一个功能,您会注意到不同之处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。


推荐阅读