分组后再按条件过滤-Having子句

分组后再按条件过滤-Having子句

分组后再按条件过滤-Having子句

HAVING 子句作用

HAVING 子句需要与 GROUP BY 子句搭配使用,专门用于对分组聚合后的查询结果进行条件筛选,提取符合条件的分组数据。

核心区别:WHERE 子句是对分组前的原始数据表数据进行过滤,而 HAVING 子句是对分组后的聚合函数结果过滤。对分组结果做筛选时,禁止使用 WHERE 关键字,否则会直接报错。

完整基础语法

SELECT column1, column2   
FROM table1, table2   
WHERE [ conditions ]   
GROUP BY column1, column2   
HAVING [ conditions ];Code language: CSS (css)

实战场景讲解

场景需求:根据科目分组,筛选出组内最大年龄不超过60岁的分组,也就是组内所有人员年龄均在60岁以下的科目分组。

执行逻辑:首先读取学生表全部数据,再根据科目字段分组并统计每组最大年龄,最后通过 HAVING 对分组后的最大年龄数据进行条件过滤。

示例语句一
SELECT subjects,max(age) 
FROM student   
GROUP BY subjects 
HAVING max(age) < 60;
示例语句二

多字段统计筛选,统计各科目分组的数据总数、最大年龄、最小ID,并筛选出分组最大年龄小于70岁的分组:

SELECT subjects,count(1),max(age),min(id)         
FROM public.student 
GROUP BY subjects 
HAVING max(age)<70;Code language: CSS (css)

核心总结

只要是对分组聚合之后的结果进行条件过滤,只能使用 HAVING 子句,绝对不能使用 WHERE 子句。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注