更新时间: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;

相关文档