SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING COUNT(*) = 2;
product_type | count |
---|---|
衣服 | 2 |
办公用品 | 2 |
Rui
November 12, 2022
上一节末尾说到,聚合函数不能放入 WHERE 子句中,那么如何选出“聚合结果为 2 的组”呢?
SELECT <列名1>, ...
FROM <表名>
GROUP BY <列名1>, ...
HAVING <分组结果对应的条件>;
按照商品种类分组,选出聚合结果为 2 的组:
product_type | count |
---|---|
衣服 | 2 |
办公用品 | 2 |
按照商品种类分组,选出平均售价大于 2500 的组:
HAVING 子句的要素为:常数、聚合函数、GROUP BY 子句中指定的列名(即聚合键)
如果 HAVING 中包含除聚合键以外的列名,则会报错。错误的方法:
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING product_name = '圆珠笔';
一些情况中,使用 HAVING 和 WHERE 能得到同样的结果,应该选择哪一种?比如:
product_type | count |
---|---|
衣服 | 2 |
product_type | count |
---|---|
办公用品 | 1 |
解答:
建议使用 WHERE
WHERE 比 HAVING 更快
HAVING 是用来指定分组聚合后“组”的条件的,WHERE 用于根据条件表达式筛选“行”。 使用时应该分清两者功能才能便于理解。