📌  相关文章
📜  mysql GROUP BY 子句;这与 sql_mode=only_full_group_by 不兼容 (1)

📅  最后修改于: 2023-12-03 15:33:01.588000             🧑  作者: Mango

MySQL GROUP BY 子句

MySQL 中的 GROUP BY 子句是对查询结果根据一个或多个列进行分组,通常是与聚合函数一起使用,例如 COUNT(), SUM(), AVG() 等等。例如,以下语句将按 category 列的值进行分组,并计算每个类别中产品的平均价格:

SELECT category, AVG(price)
FROM products
GROUP BY category;

这将返回一个包含每个类别及其平均价格的结果集。

然而,某些版本的 MySQL 设有 sql_mode 参数值为 only_full_group_by(默认值为 disabled),这会限制带有 GROUP BY 子句的查询中的选择列表或HAVING 子句的表达式必须是:分组列,聚合函数或常量。如果存在违规选择,则会导致错误。

例如,以下查询在只允许 full_group_by 模式的 MySQL 5.7 中将产生错误:

SELECT category, price
FROM products
GROUP BY category;

错误信息:Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'products.price' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.

要修复此错误,只需在选择列表中添加 price 列的聚合函数,如下所示:

SELECT category, AVG(price)
FROM products
GROUP BY category;

总结

GROUP BY 子句是 MySQL 中一个强大的工具,可以用于对结果集进行分组和聚合。但是,在使用时,必须注意 sql_mode 的设置,以确保满足 only_full_group_by 参数的要求。如果遇到错误,必须修复选择列表中的违规元素,并使用聚合函数等技巧来调整查询。