mysql sum函数性能_select count(0)

mysql sum函数性能_select count(0)MySQL 对window函数执行sum函数疑似Bug 使用MySql的窗口函数统计数据时,发现一个小的问题,与大家一起探讨下。 环境配置: mysql-installer-community-8.0

MySQL 对window函数执行sum函数疑似Bug

MySQL 对window函数执行sum函数疑似Bug

使用MySql的窗口函数统计数据时,发现一个小的问题,与大家一起探讨下。

环境配置:

  • mysql-installer-community-8.0.20.0

问题点:在sum对window函数执行时,如果有重复数据,会直接把相同的数据相加,并不是逐步相加。

问题描述

数据:在一个成绩表中,有三个个字段:学生s_id,课程c_id,成绩s_score。

查询条件查询每个课程的学生成绩排名和成绩汇总。

查询结果:发现如果同一个课程有相同成绩是,汇总成绩不是累加的,而是一次全部加上去。

创建数据表

CREATE TABLE `Score`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMARY KEY(`s_id`,`c_id`)
)

代码100分

插入数据

代码100分-- 成绩表数据
insert into Score values("01" , "01" , 80);
insert into Score values("01" , "02" , 90);
insert into Score values("01" , "03" , 99);
insert into Score values("02" , "01" , 70);
insert into Score values("02" , "02" , 60);
insert into Score values("02" , "03" , 80);
insert into Score values("03" , "01" , 80);
insert into Score values("03" , "02" , 80);
insert into Score values("03" , "03" , 80);
insert into Score values("04" , "01" , 50);
insert into Score values("04" , "02" , 30);
insert into Score values("04" , "03" , 20);
insert into Score values("05" , "01" , 76);
insert into Score values("05" , "02" , 87);
insert into Score values("06" , "01" , 31);
insert into Score values("06" , "03" , 34);
insert into Score values("07" , "02" , 89);
insert into Score values("07" , "03" , 98);

查询数据

select c_id,s_id,s_score,
first_value(s_score) over w as first_v,
last_value(s_score) over w as last_v,
sum(s_score) over w as sum_v,
max(s_score) over w as max_v,
min(s_score) over w as min_v,
count(s_id) over w as count_v,
row_number() over w as  row_id,
rank() over w as  rank_id,
dense_rank() over w as  dense_id
from score window w as (partition by c_id order by s_score desc);

查询结果

看课程号01的统计结果,数据第一行的sum_v列,前两个数据都是160,按照函数原理,数据应该是80,160。

看课程号02的统计结果,发现结果是正确的,sum_v的第一个为90,第二个为179。

实际显示与预期结果不一致,哪里出了问题。

c_id s_id s_score first_v last_v sum_v max_v min_v count_v row_id rank_id dense_id
01 01 80 80 80 160 80 80 2 1 1 1
01 03 80 80 80 160 80 80 2 2 1 1
01 05 76 80 76 236 80 76 3 3 3 2
01 02 70 80 70 306 80 70 4 4 4 3
01 04 50 80 50 356 80 50 5 5 5 4
01 06 31 80 31 387 80 31 6 6 6 5
02 01 90 90 90 90 90 90 1 1 1 1
02 07 89 90 89 179 90 89 2 2 2 2
02 05 87 90 87 266 90 87 3 3 3 3
02 03 80 90 80 346 90 80 4 4 4 4
02 02 60 90 60 406 90 60 5 5 5 5
02 04 30 90 30 436 90 30 6 6 6 6
03 01 99 99 99 99 99 99 1 1 1 1
03 07 98 99 98 197 99 98 2 2 2 2
03 02 80 99 80 357 99 80 4 3 3 3
03 03 80 99 80 357 99 80 4 4 3 3
03 06 34 99 34 391 99 34 5 5 5 4
03 04 20 99 20 411 99 20 6 6 6 5

思考验证

课程号02的数据正确,01的不正确,01与02的区别是01课程的前两个学生成绩一样都是80。

难道是成绩一样,导致sum时出错了。

为了验证这个问题,把课程号01,学号为01的成绩修改为82,然后在执行查询,结果如下

发现sum_v列显示的为82、162,与预期结果一致。

这样可以得出结论,在sum对window函数执行时,如果有重复数据,会直接把相同的数据相加,并不是逐步相加。

c_id s_id s_score first_v last_v sum_v max_v min_v count_v row_id rank_id dense_id
01 01 80 80 82 82 82 82 2 1 1 1
01 03 80 80 80 162 82 80 2 2 1 1
01 05 76 80 76 236 82 76 3 3 3 2
01 02 70 80 70 306 82 70 4 4 4 3
01 04 50 80 50 356 82 50 5 5 5 4
01 06 31 80 31 387 82 31 6 6 6 5
02 01 90 90 90 90 90 90 1 1 1 1
02 07 89 90 89 179 90 89 2 2 2 2
02 05 87 90 87 266 90 87 3 3 3 3
02 03 80 90 80 346 90 80 4 4 4 4
02 02 60 90 60 406 90 60 5 5 5 5
02 04 30 90 30 436 90 30 6 6 6 6
03 01 99 99 99 99 99 99 1 1 1 1
03 07 98 99 98 197 99 98 2 2 2 2
03 02 80 99 80 357 99 80 4 3 3 3
03 03 80 99 80 357 99 80 4 4 3 3
03 06 34 99 34 391 99 34 5 5 5 4
03 04 20 99 20 411 99 20 6 6 6 5

其他Sql验证和对比

经过上述验证,Mysql在sum时确实出现了错误,不是逐步累加的。

其他平台是否同样存在问题,在Sqlite Expert 5.3版本验证了下,发现结果一样。

这个就奇怪了,如果是Mysql在实现时出错,Sqlite出同样错误的几率小很多。

难道是sum和window函数结合使用时的特性导致的。欢迎一起讨论和研究。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7514.html

(0)
上一篇 2023-03-19
下一篇 2023-03-19

相关推荐

  • Mysql中like查询中存在反斜杠的解决方法[通俗易懂]

    Mysql中like查询中存在反斜杠的解决方法[通俗易懂]一般like查询语句: like '%test%' 但是如果某个字段存在'': 这样的写法 like '%\%' 以及 like &apo…

    2022-12-15
    142
  • pgpool-II 用户手册[通俗易懂]

    pgpool-II 用户手册[通俗易懂]简单通俗的来讲,pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件。pgpool-II主要提供负载均衡、连接池、复制、并行查询等等功能。Pg

    2023-04-27
    255
  • 没光驱怎么重装电脑系统「终于解决」

    没光驱怎么重装电脑系统「终于解决」不少用户不知道没光驱怎么重装电脑系统,下面就一起具体了解下。 1第一步打开云骑士装机大师,选择启动U盘界面,并且在电脑上插入U盘,点击制作U盘启动盘开始制作 2第二步接着就进入了选择系统的界面,在这…

    2023-04-10
    166
  • Python源码安装方法

    Python源码安装方法Python语言是一种解释型的高级程序设计语言。由于Python语言简洁易懂、代码可读性高、功能丰富、可扩展性强,已成为广泛使用的编程语言。如果您想要更加深入的了解Python语言的内部工作原理和机制,自行编译Python源码是一种不错的途径。同时,Python源码安装方法也是Python初学者需要了解的基本知识。

    2024-06-02
    52
  • mysql用户的管理

    mysql用户的管理– 创建用户 create user '用户名'@'ip地址' identified by 'password'; ip adress 可填%,即指可

    2023-03-08
    157
  • Python函数参数的使用方法

    Python函数参数的使用方法Python 函数参数是调用函数时传递给函数的值。它们被定义在函数定义中,并在函数调用时使用。Python提供了很多种不同类型的函数参数,将会在下文中详细介绍。

    2024-02-24
    107
  • Python中if和elseif语句的区别

    Python中if和elseif语句的区别在Python中,if和elseif是两种常用的条件语句。它们可以根据不同的条件执行不同的代码块。具体来说,if语句是用来判断一个条件是否成立,如果成立就执行对应的代码块;如果不成立,可以选择执行其他代码或者什么也不做。而elseif语句则是可以在if语句执行不成立时继续判断下一个条件是否成立,如果成立就执行对应的代码块。

    2024-07-10
    45
  • mysql连接查询「建议收藏」

    mysql连接查询「建议收藏」11.5连接查询(列连接) 问题:学生表有十条数据,成绩表有十条数据。 连接之后有多少条数据(笛卡尔积):10*10=100 连续查询会产生笛卡尔积;假设集合A = {a,b},集合B = {c,d}

    2023-04-14
    165

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注