ORACLE数据库中HAVING用法笔记

本文通过一个自建的优快云_HAVING成绩表,展示了如何使用SQL查询来统计总成绩超过200分的学生人数,以及找出表中重复的姓名。正确做法是先按姓名分组,然后对每个分组求和判断是否超过200分。错误的写法可能导致结果不准确。同时,文章也提供了找出表内重复姓名的SQL语句,帮助理解分组查询的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对数据聚合后计数

以自建的一张成绩表优快云_HAVING作为示例,有三个字段NAME、SUBJECT、SCORE,分别表示”姓名“、”学科“、”成绩“,表中共10行数据,包含张三、李四、王五、赵六四人的学科成绩,其中赵六只有英语成绩,另外三人有语文、数学、英语三门学科的成绩。

NAME|SUBJECT|SCORE|
----+-------+-----+
张三  |数学     |   80|
张三  |英语     |   90|
张三  |语文     |   70|
李四  |数学     |   55|
李四  |英语     |   45|
李四  |语文     |   85|
王五  |数学     |   95|
王五  |英语     |   90|
王五  |语文     |   95|
赵六  |英语     |   90|

我们现在想知道,有几个人的总成绩超过了200分,正确写法应该是:

SELECT count(DISTINCT name) FROM (
SELECT name FROM 优快云_HAVING
GROUP BY name
HAVING sum(score) > 200
)

输出结果为

COUNT(DISTINCTNAME)|
-------------------+
                  2|

即表示有2人的总成绩超过了200分,此处可能会有以下两种错误写法:

SELECT count(DISTINCT name) FROM 优快云_HAVING
GROUP BY name
HAVING sum(score) > 200

这种写法的输出结果为

COUNT(DISTINCTNAME)|
-------------------+
                  1|
                  1|

从结果可以看到,这种写法并没有直接给出人数,返回的结果是筛选出总分大于200的人后,再按姓名分组对姓名进行计数,所以返回结果的行数便是真正的答案,即2,但这种方法对于数据量较大的时候则不适用,不如直接返回数字的方法合适。
另一种错误的写法:

SELECT count(DISTINCT name) FROM 优快云_HAVING
HAVING sum(score) > 200

输出的结果是

COUNT(DISTINCTNAME)|
-------------------+
                  4|

这里是因为去掉了按姓名分组,所以HAVING的是表里所有人的成绩,也就是说这里的筛选条件实际并没有起到效果,因为把所有人的成绩加起来是超过200的,所以筛选完之后仍然是4个人。

找出数据中的重复值

仍然以上面的优快云_HAVING表为例,现在想找出表内重复出现的姓名,可以使用下面的sql:

SELECT name FROM 优快云_HAVING
GROUP BY name
HAVING count(name) > 1

输出的结果是

NAME|
----+
张三  |
王五  |
李四  |

也就是这三个人的名字在表内重复出现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟意昶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值