
# 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;
```
