加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 财气网 (https://www.caiqiwang.com/)- AI开发硬件、专属主机、建站、CDN、云容器引擎!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

mssql HAVING 子句 第五十章 SQL命令 HAVING(一)

发布时间:2023-05-24 01:02:56 所属栏目:MsSql教程 来源:转载
导读: 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
第五十章 SQL命令 HAVING(一)
对一组数据值指定一个或多个限制性条件的SELECT子句。
大纲
SELECT field
FROM table
GROUP

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

第五十章 SQL命令 HAVING(一)

对一组数据值指定一个或多个限制性条件的SELECT子句。

大纲

SELECT field
FROM table
GROUP BY field
HAVING condition-expression
SELECT aggregatefunc(field %AFTERHAVING)
FROM table
[GROUP BY field]
HAVING condition-expression
复制代码

参数描述

可选的HAVING子句出现在FROM子句、可选的WHERE和GROUP BY子句之后,可选的ORDER BY子句之前。

SELECT语句的HAVING子句限定或取消查询选择中的特定行。符合条件的行是条件表达式为真的行。条件表达式是一系列逻辑测试(谓词),它们可以通过AND和OR逻辑运算符链接起来。

HAVING子句类似于WHERE子句,它可以在组上操作,而不是在整个数据集上操作。因此,在大多数情况下,HAVING子句要么与使用%AFTERHAVING关键字的聚合函数一起使用,要么与GROUP BY子句结合使用,或者两者兼而有之。

HAVING子句条件表达式还可以指定聚合函数。WHERE子句条件表达式不能指定聚合函数。下面的示例显示了这一点:

SELECT Name,Age,AVG(Age) AS AvgAge
FROM Sample.Person
HAVING Age > AVG(Age)
ORDER BY Age
复制代码

image.png

HAVING子句通常用于将子群体的聚合与整个群体的聚合进行比较。

指定字段

HAVING子句条件表达式或%AFTERHAVING关键字表达式中指定的字段必须指定为字段名或聚合函数。不能按列号指定字段或聚合函数。不能按列别名指定字段或聚合函数;尝试这样做会生成SQLCODE-29错误。但是,可以使用子查询定义列别名,然后在HAVING子句中使用该别名。例如:

SELECT Y AS TeenYear,AVG(Y %AFTERHAVING) AS AvgTeenAge FROM 
      (SELECT Age AS Y FROM Sample.Person WHERE Age<20) 
HAVING Y > 12 ORDER BY Y
复制代码

image.png

选择项列表中的聚合函数

HAVING子句选择要返回的行。默认情况下,此行选择不确定选择项列表中的聚合函数的值。这是因为HAVING子句在SELECT-ITEM列表中的聚合函数之后进行解析。

在下面的示例中,只返回Age > 65的行。但AVG(年龄)是基于所有行计算的,而不仅仅是HAVING子句选择的行:

SELECT Name,Age,AVG(Age) AS AvgAge FROM Sample.Person
HAVING Age > 65
 ORDER BY Age
复制代码

image.png

将它与WHERE子句进行比较,WHERE子句选择返回哪些行,以及在select-item列表的聚合函数中包含哪些行值:

SELECT Name,Age,AVG(Age) AS AvgAge FROM Sample.Person
WHERE Age > 65
ORDER BY Age
复制代码

HAVING子句可以用于只返回聚合值的查询:

SELECT AVG(Age) FROM Sample.Person HAVING COUNT(*)>99
复制代码

image.png

SELECT AVG(Age) FROM Sample.Person HAVING %ID<10
复制代码

image.png

这与带有聚合函数的WHERE子句相反,后者返回一行。聚合函数值是根据满足WHERE子句条件的行计算的:

SELECT AVG(Age) FROM Sample.Person HAVING %ID<10
复制代码

image.png

%AFTERHAVING

%AFTERHAVING关键字可以与选择项列表中的聚合函数一起使用,以指定在应用HAVING子句条件之后执行聚合操作。

SELECT Name,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 HAVING Age > 40 AND Age < 65
 ORDER BY Age
复制代码

image.png

只有满足以下两个条件时,%AFTERHAVING关键字才会给出有意义的结果:

下面的示例使用带有GROUP BY子句的HAVING子句返回状态平均年龄,以及大于表中所有行平均年龄的人的状态平均年龄。它还使用子查询返回表中所有行的平均年龄:

SELECT Home_State,(SELECT AVG(Age) FROM Sample.Person) AS AvgAgeAllRecs,
       AVG(Age) AS AvgAgeByState,AVG(Age %AFTERHAVING) AS AvgOlderByState 
FROM Sample.Person
GROUP BY Home_State
HAVING Age > AVG(Age)
ORDER BY Home_State
复制代码

image.png

逻辑谓词

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岁)的每个年龄返回一条记录:

SELECT Name, Age FROM Sample.Person
GROUP BY Age
HAVING Age BETWEEN 18 AND 35
ORDER BY Age
复制代码

image.png

(编辑:财气旺网 - 财气网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章