GROUP BY的结果是否应按照SQL标准进行相应排序?

GROUP BY的结果是否应按照SQL标准进行相应排序?,sql,Sql,GROUP BY的结果是否应按照SQL标准进行相应排序 许多数据库返回分组依据的排序结果 但它是由SQL92或其他标准强制执行的吗 No.groupby对返回行的顺序没有标准影响。这就是ORDER BY的设计目的 如果您得到的是GROUP by返回的某种可重复或可预测的排序顺序,则这是标准中未定义的DBMS中正在执行的操作。正如前面的答案所解释的,除了order by之外,任何基本SQL构造都不会暗示任何排序 然而,为了计算GROUPBY,可以进行索引扫描或内存排序来创建存储桶,并且这种索引扫描

GROUP BY的结果是否应按照SQL标准进行相应排序

许多数据库返回分组依据的排序结果

但它是由SQL92或其他标准强制执行的吗

No.groupby对返回行的顺序没有标准影响。这就是ORDER BY的设计目的


如果您得到的是GROUP by返回的某种可重复或可预测的排序顺序,则这是标准中未定义的DBMS中正在执行的操作。

正如前面的答案所解释的,除了order by之外,任何基本SQL构造都不会暗示任何排序

然而,为了计算GROUPBY,可以进行索引扫描或内存排序来创建存储桶,并且这种索引扫描或排序意味着按排序顺序遍历数据。因此,一个特定的数据库经常表现出这样的行为并不是偶然的。但是,不要依赖它,因为如果使用不同的索引集,甚至只是不同的查询计划,只要插入几次和/或重新启动数据库服务器,就可以触发不同的查询计划,那么行为可能会大不相同

还要注意,在ORDERBY子句中重新排列列列表将导致可靠地重新排列输出,而在GROUPBY子句中重新排列列列表可能不会产生任何效果


使用看似多余的orderby不会带来性能成本。如果原始的查询计划已经保证了排序输出,那么查询计划可能是相同的。

嗯,标准中不包含按分组的输出排序,因为有一些标准的分组算法不会按顺序生成结果

其中最常见的是使用哈希表进行分组

此外,在多线程服务器上,可以对数据进行排序,但结果将逐处理器返回。不能保证最低阶处理器会首先返回数据

而且,在并行机上,可以使用多种方法在处理器之间分割数据。例如,以a结尾的所有字符串都可以转到一个处理器。所有这一切都以b结尾。然后可以对这些结果进行局部排序,但结果本身不会进行整体排序


像mysql这样的数据库保证在分组之后进行排序,这是一个糟糕的设计决策。除了不符合标准外,此类数据库还限制了算法的选择或对订购进行额外处理。

实际上,订购是不必要的。我同意它几乎总是这样做的,因为不这样做会大大降低性能,但我所见过的任何SQL标准都不要求这样做。这个问题问到是否有任何标准强制执行分组排序顺序,而这个问题的答案是否定的:@KenWhite-这就是为什么我在决定添加更多细节来解释OP观察到和设想的内容之前,对你的答案投了更高的票-还有为什么我没有投你的反对票,尽管从技术上讲这不是对所问问题的回答。不过,我还想澄清你所说的话,以及我的评论-见鬼,您甚至可能不需要重新启动服务器,这取决于您的RDBMS。有些实现会根据负载的不同尝试不同的事情,因此您也不必总是添加/删除/更改数据。好的,对我的主题外答案进行了一些润色,并添加了一个关于多列子句的注释,其中分组和排序之间的差异特别容易观察到。+1用于了解,但我不相信你在mysql上提供了这样的保证,除非你能提供一个参考。版本5.0的文档似乎另有说明。