更新时间:2026-07-03 GMT+08:00
HAVING
功能描述
HAVING子句用于对GROUP BY分组后的结果进行过滤。与WHERE不同,HAVING可以使用聚合函数作为过滤条件。Spark 4.0增强了HAVING子句中的子查询能力。
语法格式
SELECT [ ALL | DISTINCT ] projectItem [, ...] FROM table_reference
GROUP BY { expression [, ...] | GROUPING SETS (...) | ROLLUP (...) | CUBE (...) }
HAVING boolean_expression 参数说明
| 参数 | 说明 |
|---|---|
| ALL | 返回所有行,包括重复行。为默认选项。 |
| DISTINCT | 从结果集中移除重复的行。 |
| GROUP BY | 按指定表达式分组,支持GROUPING SETS、ROLLUP、CUBE扩展。 |
| HAVING | 对分组后的结果进行过滤,条件中可以使用聚合函数和子查询。 |
| boolean_expression | 过滤条件表达式,通常包含聚合函数。可以包含子查询。 |
注意事项
- 所要查询的表必须是已经存在的表,否则会出错。
- HAVING中的子查询与聚合函数的位置不能互换,聚合函数应在比较运算符的左侧。
- HAVING与WHERE的区别:WHERE在分组前过滤行,HAVING在分组后过滤组。
示例
基本HAVING过滤:
SELECT class_id, AVG(score) AS avg_score FROM student GROUP BY class_id HAVING AVG(score) > 80;
子查询作为HAVING条件:
SELECT name FROM student_info GROUP BY name HAVING count(name) = (SELECT count(*) FROM course_info);
与ROLLUP配合使用:
SELECT group_id, job, SUM(salary) FROM group_test GROUP BY ROLLUP (group_id, job) HAVING SUM(salary) > 10000;
父主题: 子句