搞定 MySQL GROUP BY 报错:1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
2023-04-15 00:25:49
GROUP BY 语句中包含聚合的非分组列
错误的本质
当你在 GROUP BY 语句中使用没有被分组或聚合的列时,就会触发这个错误。这是因为 MySQL 需要知道如何处理这些列,而如果不进行分组或聚合,MySQL 就无法确定如何处理它们。
解决方法
要解决这个错误,你可以选择以下几种方法:
1. 将列添加到 GROUP BY 子句中
这将告诉 MySQL 将该列作为分组依据。例如,如果你想按学生 ID 分组,并计算每个学生的平均分,你可以使用以下查询:
SELECT student_id, AVG(score)
FROM students
GROUP BY student_id;
2. 将列用聚合函数包装起来
这将告诉 MySQL 将该列用聚合函数(如 SUM、AVG、MAX、MIN)进行聚合。例如,如果你想计算所有学生的平均分,你可以使用以下查询:
SELECT AVG(score)
FROM students;
3. 使用子查询
如果你想在 GROUP BY 语句中使用一个没有被分组或聚合的列,你可以使用子查询。例如,如果你想按学生 ID 分组,并计算每个学生的平均分,但你又想在结果中显示每个学生的姓名,你可以使用以下查询:
SELECT student_name, AVG(score)
FROM (
SELECT student_id, score, student_name
FROM students
) AS subquery
GROUP BY student_id;
避免错误的建议
1. 不要在 GROUP BY 语句中使用 DISTINCT
这会导致 MySQL 报出 "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column" 的错误。
**2. 不要在 GROUP BY 语句中使用 ORDER BY **
这会导致 MySQL 报出 "Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column" 的错误。
总结
"Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column" 错误是由于你在 GROUP BY 语句中使用了没有被分组或聚合的列造成的。你可以通过将列添加到 GROUP BY 子句、将列用聚合函数包装起来或使用子查询来解决这个错误。
常见问题解答
1. 我可以通过其他方式解决这个错误吗?
是的,你还可以通过创建临时表或使用窗口函数来解决这个错误。但是,这些方法通常比上面列出的方法更复杂。
2. GROUP BY 语句中哪些列必须被分组或聚合?
所有不在聚合函数中的列都必须被分组。例如,在以下查询中,列 "student_name" 必须被分组:
SELECT student_name, AVG(score)
FROM students
GROUP BY student_id;
3. 我可以在 GROUP BY 语句中使用子查询吗?
是的,你可以在 GROUP BY 语句中使用子查询。但是,子查询必须返回一个单个列,并且该列必须与 GROUP BY 子句中的列具有相同的数据类型。
4. 我可以在 GROUP BY 语句中使用 ORDER BY 关键字吗?
是的,你可以在 GROUP BY 语句中使用 ORDER BY 关键字。但是,ORDER BY 子句中的所有列都必须被分组或聚合。
5. 我可以在 GROUP BY 语句中使用 DISTINCT 关键字吗?
不能,你不能在 GROUP BY 语句中使用 DISTINCT 关键字。DISTINCT 关键字用于从结果集中删除重复行,但它不能与 GROUP BY 子句结合使用。