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 |
+------+-------+

group by

sql经常会出现以下错误

ERROR 1140 (42000): In aggregated query without GROUP BY

首先解释一下

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;

设想一下上面的语句会返回什么结果?返回的结果中两列之间有强烈的关联吗?

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

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

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

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

select sid,sum(score) from sc
group by sid;

上面的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';
  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值