HAVING子句
HAVING 子句指定 GROUP BY 子句选择的组的搜索条件。
HAVING 子句表示您 只 需要那些满足该子句中的条件的组。 因此,您在 HAVING 子句中指定的搜索条件必须测试每个组的属性,而不是组中各个行的属性。
HAVING 子句跟在 GROUP BY 子句之后,并且可以包含与您可以在 WHERE 子句中指定的相同类型的搜索条件。 此外,可以在 HAVING 子句中指定聚集函数。 例如,假设您要检索每个部门中女性的平均工资。 为此,请使用 AVG 聚集函数并按 WORKDEPT 对生成的行进行分组,并指定 WHERE 子句 SEX = 'F'。
要指定仅当所选部门中的所有女性员工的教育程度等于或大于 16 (大学毕业生) 时才需要此数据,请使用 HAVING 子句。 HAVING 子句用于测试组的属性。 在这种情况下,测试在 MIN (EDLEVEL) 上,它是组属性:
SELECT WORKDEPT, DECIMAL(AVG(SALARY),5,0) AS AVG_WAGES, MIN(EDLEVEL) AS MIN_EDUC
FROM CORPDATA.EMPLOYEE
WHERE SEX='F'
GROUP BY WORKDEPT
HAVING MIN(EDLEVEL)>=16;结果如下。
| WORKDEPT | 平均工资 | MIN_EDUC |
|---|---|---|
| A00 | 49625 | 18 |
| C01 | 29722 | 16 |
| D11 | 25817 | 17 |
通过将多个谓词与 AND 和 OR 连接,可以在 HAVING 子句中使用这些谓词,并且可以将 NOT 用于搜索条件的任何谓词。
注: 如果您打算更新列或删除行,那么不能在 SELECT 语句中的 DECLARE CURSOR 语句中包含 GROUP BY 或 HAVING 子句。 这些子句使其成为只读游标。
可以在 WHERE 或 HAVING 子句中对具有非聚集函数的自变量的谓词进行编码。 通常,在 WHERE 子句中对选择条件进行编码的效率更高,因为它在查询处理中是较早处理的。 HAVING 选择在结果表的后处理中执行。
如果搜索条件包含涉及字符的谓词,或者包含 UCS-2 或 UTF-16 图形列,那么运行查询时生效的排序顺序将应用于这些谓词。