GROUP BY的结果是否应该相应地对SQL标准进行排序?
许多数据库返回GROUP BY的排序结果,
但它是由SQL92还是其他标准强制执行的?
答案 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这样的数据库可以保证分组后的排序做出糟糕的设计决策。除了不符合标准外,此类数据库要么限制算法的选择,要么对订购进行额外的处理。