mssql HAVING 子句 第五十章 SQL命令 HAVING(一)
第五十章 SQL命令 HAVING(一)
对一组数据值指定一个或多个限制性条件的SELECT子句。
大纲
SELECT field
FROM table
GROUP
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。 第五十章 SQL命令 HAVING(一) 对一组数据值指定一个或多个限制性条件的SELECT子句。 大纲
参数描述 可选的HAVING子句出现在FROM子句、可选的WHERE和GROUP BY子句之后,可选的ORDER BY子句之前。 SELECT语句的HAVING子句限定或取消查询选择中的特定行。符合条件的行是条件表达式为真的行。条件表达式是一系列逻辑测试(谓词),它们可以通过AND和OR逻辑运算符链接起来。 HAVING子句类似于WHERE子句,它可以在组上操作,而不是在整个数据集上操作。因此,在大多数情况下,HAVING子句要么与使用%AFTERHAVING关键字的聚合函数一起使用,要么与GROUP BY子句结合使用,或者两者兼而有之。 HAVING子句条件表达式还可以指定聚合函数。WHERE子句条件表达式不能指定聚合函数。下面的示例显示了这一点:
HAVING子句通常用于将子群体的聚合与整个群体的聚合进行比较。 指定字段 HAVING子句条件表达式或%AFTERHAVING关键字表达式中指定的字段必须指定为字段名或聚合函数。不能按列号指定字段或聚合函数。不能按列别名指定字段或聚合函数;尝试这样做会生成SQLCODE-29错误。但是,可以使用子查询定义列别名,然后在HAVING子句中使用该别名。例如:
选择项列表中的聚合函数 HAVING子句选择要返回的行。默认情况下,此行选择不确定选择项列表中的聚合函数的值。这是因为HAVING子句在SELECT-ITEM列表中的聚合函数之后进行解析。 在下面的示例中,只返回Age > 65的行。但AVG(年龄)是基于所有行计算的,而不仅仅是HAVING子句选择的行:
将它与WHERE子句进行比较,WHERE子句选择返回哪些行,以及在select-item列表的聚合函数中包含哪些行值:
HAVING子句可以用于只返回聚合值的查询:
这与带有聚合函数的WHERE子句相反,后者返回一行。聚合函数值是根据满足WHERE子句条件的行计算的:
%AFTERHAVING %AFTERHAVING关键字可以与选择项列表中的聚合函数一起使用,以指定在应用HAVING子句条件之后执行聚合操作。
只有满足以下两个条件时,%AFTERHAVING关键字才会给出有意义的结果: 下面的示例使用带有GROUP BY子句的HAVING子句返回状态平均年龄,以及大于表中所有行平均年龄的人的状态平均年龄。它还使用子查询返回表中所有行的平均年龄:
逻辑谓词 SQL谓词可分为以下几类: 注意:不能在HAVING子句中使用FOR SOME %ELEMENT集合谓词。此谓词只能在WHERE子句中使用。 谓词区分大小写 谓词使用为字段定义的排序规则类型。默认情况下,字符串数据类型字段使用SQLUPPER排序规则定义,该排序规则不区分大小写。 %INLIST、CONTAINS运算符([)、%Matches和%%PATTERN谓词不使用字段的默认排序规则。它们总是使用精确排序,这是区分大小写的。 两个文字字符串的谓词比较始终区分大小写。 谓词条件和%NOINDEX 可以使用%NOINDEX关键字作为谓词条件的前缀,以防止查询优化器在该条件上使用索引。这在指定绝大多数行都满足的范围条件时非常有用。例如,HAVING %NOINDEX Age >= 1。 相等比较谓词 以下是可用的比较谓词: 谓词操作 = 相等 不相等 != 不相等 > 大于 = 大于等于 = Home_State TRUE for values AK, AL, AR. 但是请注意mssql HAVING 子句,两个文字字符串的比较区分大小写:其中'ma'='MA'始终为false。 BETWEEN谓语 这等效于大于或等于且小于或等于的配对。下面的示例使用BETWEEN谓词。它为18到35岁(包括18到35岁)的每个年龄返回一条记录:
(编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |