ORACLE数据库中HAVING用法笔记
对数据聚合后计数以自建的一张成绩表CSDN_HAVING作为示例,有三个字段NAME、SUBJECT、SCORE,分别表示”姓名“、”学科“、”成绩“,表中共10行数据,包含张三、李四、王五、赵六四人的学科成绩,其中赵六只有英语成绩,另外三人有语文、数学、英语三门学科的成绩。NAME|SUBJECT|SCORE|----+-------+-----+张三|数学|80|张三|英语|90|张三|语文|
·
对数据聚合后计数
以自建的一张成绩表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|
----+
张三 |
王五 |
李四 |
也就是这三个人的名字在表内重复出现
更多推荐
已为社区贡献1条内容
所有评论(0)