

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# HAVING 子句
<a name="sql-reference-having-clause"></a>

SELECT 中的 HAVING 子句用于指定要在组或聚合中应用的条件。换句话说，HAVING 会在对 GROUP BY 子句应用聚合之后筛选行。由于 HAVING 在 GROUP BY 之后计算，因此只能引用由分组键、聚合表达式和常量构建（或派生）的表达式。（这些规则也适用于 GROUP BY 查询的 SELECT 子句中的表达式。） HAVING 子句必须位于 GROUP BY 子句之后和 ORDER BY 子句之前。HAVING 类似于 [WHERE 子句](sql-reference-where-clause.md)，但适用于组。HAVING 子句生成的结果表示原始行的分组或聚合，而 WHERE 子句生成的结果是各个原始行。

在非流式应用程序中，如果没有 GROUP BY 子句，则假定使用 GROUP BY ()（但由于没有分组表达式，因此表达式只能由常量和聚合表达式组成）。在流式查询中，如果没有 GROUP BY 子句，就无法使用 HAVING。

WHERE 和 HAVING 都可以出现在单个 SELECT 语句中。WHERE 从流或表中选择各个满足其条件（WHERE 条件）的行。GROUP BY 条件仅适用于 WHERE 条件选择的行。

此类分组（例如“GROUP BY CustomerID”）可以根据 HAVING 条件进一步限定，然后选择指定分组中满足其条件的行的聚合。例如，“按客户编号分组总和 (ShipmentValue) > 3600” 将仅选择那些符合 WHERE 标准的各种货物的值加起来也超过 3600 的客户。

有关同时适用于 HAVING 和 WHERE 子句的条件，请参阅 WHERE 子句语法图表。

条件必须是布尔谓词表达式。查询仅返回谓词为 TRUE 的行。

以下示例显示的流式查询展示了过去一小时内订单金额超过 1000 美元的产品。

```
SELECT STREAM "prodId"
FROM "Orders"
GROUP BY FLOOR("Orders".ROWTIME TO HOUR), "prodId"
HAVING SUM("quantity" * "price") > 1000;
```