栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ORACLE数据库中HAVINg用法笔记

ORACLE数据库中HAVINg用法笔记

对数据聚合后计数

以自建的一张成绩表CSDN_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 CSDN_HAVINg
GROUP BY name
HAVINg sum(score) > 200
)

输出结果为

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

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

SELECt count(DISTINCT name) FROM CSDN_HAVINg
GROUP BY name
HAVINg sum(score) > 200

这种写法的输出结果为

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

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

SELECt count(DISTINCT name) FROM CSDN_HAVINg
HAVINg sum(score) > 200

输出的结果是

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

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

找出数据中的重复值

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

SELECt name FROM CSDN_HAVINg
GROUP BY name
HAVINg count(name) > 1

输出的结果是

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326532.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号