为何GROUP BY未按预期分组啤酒?ORDER BY却可行,求技术解答
GROUP BY与ORDER BY分组展示差异的技术解答
问题描述
我希望通过GROUP BY对啤酒进行分组,将对应啤酒的品鉴者和聚合后的评分分别列在不同字段中。编写了如下SQL创建视图:
create or replace view tasters_avg_ratings1 as select a.taster as taster, a.beer as beer, round(avg(a.rating),1) as rating from allratings a group by beer, taster ;
但查询结果中啤酒并未被分组显示(例如'Victoria Bitter'分散在结果中),添加ORDER BY a.beer后却能得到按啤酒分组的预期结果:
create or replace view tasters_avg_ratings1 as select a.taster as taster, a.beer as beer, round(avg(a.rating),1) as rating from allratings a group by beer, taster order by a.beer ;
疑惑为何GROUP BY无法实现按啤酒分组展示的效果,而ORDER BY可以,求技术解答。
核心解答
两者的本质作用完全不同
GROUP BY负责数据聚合,不控制输出顺序
你写的GROUP BY beer, taster是把表中啤酒名称和品鉴者都相同的行聚合在一起,计算每个品鉴者对对应啤酒的平均评分。它只保证相同(beer, taster)组合的行被合并,但SQL标准没有规定聚合后结果的输出顺序——数据库可以按任意顺序返回这些聚合行,所以同一个啤酒的不同品鉴者记录会分散出现。ORDER BY专门控制结果的展示顺序
ORDER BY a.beer会强制数据库将最终结果按beer字段排序输出,这样同一个啤酒的所有品鉴者记录就会集中在一起,形成你想要的“分组展示”视觉效果。但这只是排序后的呈现,和GROUP BY的聚合逻辑是完全独立的两个操作。额外注意:数据库的非标准行为
部分数据库(比如旧版本MySQL的特定配置)可能会默认按GROUP BY的字段顺序返回结果,但这属于数据库的非标准实现,不具备通用性。SQL标准明确要求:如果需要固定的输出顺序,必须显式添加ORDER BY,不能依赖GROUP BY的隐含排序。
内容的提问来源于stack exchange,提问作者Rayyan Khan
相关产品推荐
相关产品推荐

