HAVING 语句
有的时候需要对部分分组进行过滤,比如只检索人数多余1个的年龄段,有的开发人员会使用下面的SQL语句:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1
可以在数据库系统中执行下面的SQL的时候,数据库系统会提示语法错误,这是因为聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
23 2
25 2
28 3
HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件,比如下面的SQL用来检索人数为1个或者3个的年龄段,可以使用下面的SQL:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) =1 OR COUNT(*) =3
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
22 1
27 1
28 3
也可以使用IN操作符来实现上面的功能,SQL语句如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) IN (1,3)
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
22 1
27 1
28 3
HAVING语句能够使用的语法和WHERE几乎是一样的,不过使用WHERE的时候GROUP BY子句要位于WHERE子句之后,而使用HAVING子句的时候GROUP BY子句要位于HAVING子句之后,比如下面的SQL是错误的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee HAVING COUNT(*) IN (1,3) GROUP BY FAge
需要特别注意,在HAVING语句中不能包含未分组的列名,比如下面的SQL语句是错误的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING FName IS NOT NULL
执行的时候数据库系统会提示类似如下的错误信息:
HAVING 子句中的列"T_Employee.FName" 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
需要用WHERE语句来代替HAVING,修改后的SQL语句如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
22 1
23 2
25 2
28 3
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1
可以在数据库系统中执行下面的SQL的时候,数据库系统会提示语法错误,这是因为聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
23 2
25 2
28 3
HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件,比如下面的SQL用来检索人数为1个或者3个的年龄段,可以使用下面的SQL:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) =1 OR COUNT(*) =3
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
22 1
27 1
28 3
也可以使用IN操作符来实现上面的功能,SQL语句如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) IN (1,3)
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
22 1
27 1
28 3
HAVING语句能够使用的语法和WHERE几乎是一样的,不过使用WHERE的时候GROUP BY子句要位于WHERE子句之后,而使用HAVING子句的时候GROUP BY子句要位于HAVING子句之后,比如下面的SQL是错误的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee HAVING COUNT(*) IN (1,3) GROUP BY FAge
需要特别注意,在HAVING语句中不能包含未分组的列名,比如下面的SQL语句是错误的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING FName IS NOT NULL
执行的时候数据库系统会提示类似如下的错误信息:
HAVING 子句中的列"T_Employee.FName" 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
需要用WHERE语句来代替HAVING,修改后的SQL语句如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge
执行完毕我们就能在输出结果中看到下面的执行结果:
FAge CountOfThisAge
22 1
23 2
25 2
28 3
https://github.com/godmaybelieve
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理