首页/数据/SQL 速查/ONLY_FULL_GROUP_BY 与分组合法性
聚合与窗口函数54 条

ONLY_FULL_GROUP_BY 与分组合法性

非聚合列不在 GROUP BY 中时:MySQL 默认模式直接报错(ONLY_FULL_GROUP_BY),PostgreSQL 同样拒绝;识别主键函数依赖可放行。

SQL 速查数据更新于 2026-10-12

错误与修正

错误与修正
-- 错误:name 既不在 GROUP BY 也不是聚合
SELECT city, name, COUNT(*)
FROM users
GROUP BY city;   -- ERROR

-- 修正 1:把列加入分组
SELECT city, name, COUNT(*)
FROM users
GROUP BY city, name;   -- 结果粒度随之变化

-- 修正 2:用聚合表达
SELECT city, MAX(name) AS sample_name, COUNT(*)
FROM users
GROUP BY city;
MySQL默认启用 ONLY_FULL_GROUP_BY;检测到主键函数依赖时允许取同表其他列
PostgreSQL标准行为同样要求;主键可带动同表其他列

易错点

  • 关闭 ONLY_FULL_GROUP_BY 让旧 SQL 跑起来是隐患:取到的非聚合列值不确定
  • 把列塞进 GROUP BY 会改变分组粒度,先去重再统计或用聚合函数往往更正确

数据来源与参考

  • MySQL 8.0 Reference Manual · MySQL Handling of GROUP BY
  • PostgreSQL Documentation · GROUP BY
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌