我需要运行一个查询,对结果进行分组并对其进行排序。当我使用以下查询时,我注意到结果是按字段name
排序的:
SELECT name, count(name)
FROM contacts
GROUP BY name
HAVING count(name)>1
最初我计划使用以下查询:
SELECT name, count(name)
FROM contacts
GROUP BY name
HAVING count(name)>1
ORDER BY name
我担心顺序会大大减慢运行时间。 我是否可以依赖ms-access始终按我分组的字段排序,并通过消除顺序?
编辑:我尝试将其他表中的不同字段分组,并且始终按分组字段排序。
我已经向其他SQL DBMS找到了这个问题的答案,但没有找到。
答案 0 :(得分:8)
GROUP BY
和ORDER BY
如何正常工作在为GROUP BY
或DISTINCT
操作创建组时,数据库通常会在排序和散列之间进行选择。如果他们确实选择了排序,那么您可能会很幸运,并且GROUP BY
的应用与实际结果集消耗之间的排序是稳定的。但是稍后,由于数据库可能突然更喜欢无顺序散列算法来生成组,因此可能会中断。
在 no database 中,您应该依赖任何隐式排序行为。您应始终使用显式ORDER BY
。如果数据库足够复杂,添加显式ORDER BY
子句将提示排序对于分组操作也更为理想,因为排序可以在查询执行管道中重复使用。
我尝试将其他表中的不同字段分组,并且始终按分组字段排序。
您是否详尽地尝试了所有可能表达的查询?即你尝试过了吗?
JOIN
OUTER JOIN
JOIN
(使用EXISTS
或IN
)JOIN
(使用NOT EXISTS
或NOT IN
)DISTINCT
+ GROUP BY
(这肯定会破坏您的订购)UNION
或UNION ALL
(无论如何都打败了这个论点)我打赌你没有。即使您尝试了上述所有内容,您是否可以确定上面没有一个非常特殊的配置,只是因为您已经观察到某些(许多)实验中的行为? / p>
你不能。
就MS Access而言,请考虑documentation on ORDER BY
<强>说明强>
ORDER BY是可选的。但是,如果您希望数据按排序顺序显示,则必须使用ORDER BY。
注意措辞。 “你必须使用ORDER BY”。因此,MS Acces与其他数据库没什么不同。
所以你关于表现的问题是朝着错误的方向发展的。在这种情况下,您不能牺牲性能的正确性。通过使用索引更好地解决性能问题。
答案 1 :(得分:3)
以下是Access SQL中GROUP BY
子句的MSDN文档:
https://msdn.microsoft.com/en-us/library/bb177905(v=office.12).aspx
该页面未提及结果的任何隐含或自动排序 - 如果您确实看到了没有明确ORDER BY
的所需排序,那么这完全是巧合。
唯一的方法保证SQL中结果的特定顺序是ORDER BY
。
使用ORDER BY
(通常) 是一个轻微的性能问题,因为它需要DBMS在输出第一行结果之前先获取所有结果(尽管DBMS可以自由地使用&#34;在线排序&#34;算法在从后备存储中获取每一行时对数据进行排序,它仍然需要从后备存储中获取最后一行,然后才能将第一行返回到客户端(如果后备存储的最后一行恰好是根据ORDER BY
的第一个结果) - 但是除非您在延迟敏感的应用程序中查询数万行,否则这是不是问题 - 而且当您使用Access时,很明显这不是对性能敏感的应用程序。