In aggregated query without GROUP BY是什么错误

本文所使用的表:

表 sc

±-----±------+
| sid | score |
±-----±------+
| 01 | 80.0 |
| 01 | 90.0 |
| 01 | 99.0 |
| 02 | 70.0 |
| 02 | 60.0 |
| 02 | 80.0 |
| 03 | 80.0 |
| 03 | 80.0 |
| 03 | 80.0 |
±-----±------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
group by
sql经常会出现以下错误

ERROR 1140 (42000): In aggregated query without GROUP BY
1
首先解释一下

aggregate 是sql中函数的一个种类,这类函数称为聚合函数,以下都是聚合函数

AVG() - 返回平均值
COUNT() - 返回行数
FIRST() - 返回第一个记录的值
LAST() - 返回最后一个记录的值
MAX() - 返回最大值
MIN() - 返回最小值
SUM() - 返回总和
所以这个错误就是说你写了一条包含 aggregate函数的查询语句但是没有使用 group by 分组。

那么,为什么没有使用 group by 分组就是错误呢?

以 聚合函数中的 sum 函数为例。sum (score) 计算 score 列的和,如果在sql查询语句中同时选择了 sid 和 sum (score)

select sid,sum(score) from sc;
1
设想一下上面的语句会返回什么结果?返回的结果中两列之间有强烈的关联吗?

显然这样的查询语句意义不明,所以也就无法返回一个关系比较合理的表。

为了使返回结果合理,就要让查询语句的意义进一步明确。

所以 需要 用 group by 来修饰上面的查询语句。

group by 的字面意思是 “以……分组”,在 sql 中转门用来修饰聚合函数

select sid,sum(score) from sc
group by sid;
1
2
上面的sql 语句意思就是 以sid 作为分组的依据,对 score 进行分组求和。那么求得的 sum 就与 sid 有正确的一一对应关系,在此例中就是含义就是每个sid 的 总分。

当sql查询语句中除了聚合函数外选择了多个字段,在group by 的时候都要加上,道理很简单,如果只用
多个字段中的一个字段作为分组的依据,那么剩下的字段任然无法与 聚合函数之间构成有明确合理的关联。

最后,通过修改 sql_mode 变量,可以使得聚合函数不强制绑定 group by 任然能返回结果,修改方式如下

set sql_mode =‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’;
————————————————
版权声明:本文为优快云博主「lubxx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/lubxx/article/details/107871766

参考以上内容,项目上报错,由于不允许改动sql_mode 变量,只能改动SQL语句

查找到具体原因为mapper中的SQL在这里插入图片描述
改动后的SQL
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值