MySQL查询SELECT非分组/非聚合列未报错原因探究
为什么这个MySQL分组查询不报错?
你遇到的这个情况,核心原因是MySQL的sql_mode没有开启ONLY_FULL_GROUP_BY模式,这是MySQL和标准SQL规则不一样的地方:
- 按照SQL标准,GROUP BY子句定义分组后,SELECT里的列只能是GROUP BY中出现的列,或者被聚合函数(比如COUNT、MAX)包裹的列,否则会因为无法确定要返回分组里的哪一行数据而报错。
- 但MySQL在未手动配置的环境下,默认不会强制遵循这个标准,当你写了非分组/非聚合的列时,它会从分组内的任意一行选取该列的值返回。
回到你贴的这个查询:
Select m.name from employee as e inner join employee as m on e.managerId=m.id group by e.managerId having count(e.id)>=5
这里能得到正确结果其实是个巧合——因为e.managerId关联的是m.id,而id通常是employee表的主键,每个id对应的name是唯一的,所以不管MySQL从分组里选哪一行的m.name,结果都是对的。但如果表结构不满足这个条件(比如id不是主键,或者一个id对应多个name),这种写法就会返回错误的随机值。
如果要让查询符合标准且严谨,建议改成下面两种写法之一:
- 把
m.id和m.name都加入GROUP BY:
Select m.name from employee as e inner join employee as m on e.managerId=m.id group by m.id, m.name having count(e.id)>=5
- 用聚合函数锁定唯一值(因为每个id对应唯一name,MAX/MIN都可以):
Select MAX(m.name) as name from employee as e inner join employee as m on e.managerId=m.id group by e.managerId having count(e.id)>=5
内容的提问来源于stack exchange,提问作者tru
相关产品推荐
相关产品推荐

