本文所使用的表:
表 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';