You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何MySQL中可选择GROUP BY子句外的非聚合列?

为什么MySQL允许GROUP BY子句外的非聚合列不报错?

你的疑问很典型,这是MySQL特有的行为,核心原因和它的sql_mode设置有关:

  • 默认未启用ONLY_FULL_GROUP_BY模式
    SQL标准要求SELECT中的非聚合列必须出现在GROUP BY子句中,但MySQL默认没开启ONLY_FULL_GROUP_BY这个强制遵循标准的模式。没开这个模式时,MySQL会允许这种写法,它会从每个分组里选取一个非聚合列的值返回。

  • 这次结果正确是合理的巧合
    你这里player_id是Players表的主键,每个player_id唯一对应一个player_name。所以按player_id分组时,每个分组里的player_name都是同一个值,MySQL不管有没有把它加到GROUP BY里,都能正确取到对应的值。但如果player_id不是主键,或者一个player_id对应多个不同的player_name,那返回的player_name就会是随机的,结果完全不可控。

  • 验证和解决方法

    1. 查看当前sql_mode:执行SELECT @@sql_mode;,如果结果里没有ONLY_FULL_GROUP_BY,就确认是这个原因。
    2. 开启标准模式:可以通过SET sql_mode = 'ONLY_FULL_GROUP_BY,...';(保留原有其他模式,添加该选项)启用标准模式,之后再执行你的SQL就会抛出预期的错误。
    3. 规范写法:不管模式如何,建议把非聚合列加到GROUP BY里,比如改成group by grand, p.player_name或者group by 1,2,这样既符合SQL标准,也能避免意外问题。

内容的提问来源于stack exchange,提问作者ALAUKIK HARSH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:18:23