0
点赞
收藏
分享

微信扫一扫

In aggregated query without GROUP BY是什么错误

Alex富贵 2022-04-26 阅读 98
mysql

本文所使用的表:

表 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’;
————————————————

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

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

举报

相关推荐

0 条评论