SQL 中 select 和 group by 中数据的相互约束关系
前提#
本文的前提是 mysql 的sql_mode中含有 ONLY_FULL_GROUP_BY
。如果不含有 ONLY_FULL_GROUP_BY
,那么就没有本文后续说的限制。
可以使用下面这条sql查看。
SHOW VARIABLES LIKE 'sql_mode';
-- 输出
sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
结论#
在有group by操作中,select后面接的结果集字段只能出现以下两种:
- group by后出现的字段
- 聚合函数。如 count(), avg(), sum(), max(), min()等
原因#
比如一个表中 有 姓名,性别,年龄
group by 性别,这时候就是把男和女 分成两个组
要搜索的数据只能是基于这两个组,比如avg(年龄),基于分组以后的年龄求平均,但不能查看name,这样就一个性别里面有好几个名字,就有问题了。
所以select后面的数据要么是groupby里面出现的内容,要么是对数据表里的数据求聚合。
否则会报以下错误:
SQL_ERROR_INFO: "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'titles.emp_no' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2022-08-08 IDEA 报错 Package 'java.util' is declared in module 'java.base', which is not in the module graph