GROUP BY的结果应该相应地对SQL标准进行排序吗?

时间:2012-05-24 19:12:42

标签: sql

GROUP BY的结果是否应该相应地对SQL标准进行排序?

许多数据库返回GROUP BY的排序结果,

但它是由SQL92还是其他标准强制执行的?

3 个答案:

答案 0 :(得分:6)

没有。 GROUP BY对返回的行的顺序没有标准影响。这就是ORDER BY的目的。

如果您正在获得GROUP BY返回的某种可重复或可预测的排序顺序,那么您的DBMS中就会完成标准中未定义的内容。

答案 1 :(得分:2)

正如之前的回答所解释的那样,ORDER BY以外的任何基本SQL构造都不会隐含任何排序。

但是,要计算GROUP BY,可能会发生索引扫描或内存中排序(创建存储桶),而这样的索引扫描或排序意味着按排序顺序遍历数据。因此,特定数据库通常表现得像这样并不是偶然的。但是,不要依赖它,因为使用不同的索引集,或者甚至只是一个不同的查询计划(可以通过少量插入和/或重新启动数据库服务器来触发),行为可能是相当的不同。

另请注意,重新排序ORDER BY子句中的列列表将导致可靠地重新排序输出,而在GROUP BY子句中重新排序列列表可能不会产生任何影响。

使用看似“冗余”的ORDER BY没有性能成本。如果原始的查询计划已经保证排序输出,那么查询计划可能是相同的。

答案 2 :(得分:1)

嗯,对GROUP BY的输出进行排序不在标准中,因为有一些标准的分组算法不能按顺序生成结果。

其中最常见的是使用哈希表来执行分组。

此外,在多线程服务器上,可以对数据进行排序,但结果将逐个处理器返回。无法保证最低阶处理器是第一个返回数据的处理器。

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

像mysql这样的数据库可以保证分组后的排序做出糟糕的设计决策。除了不符合标准外,此类数据库要么限制算法的选择,要么对订购进行额外的处理。