假设我有一张桌子:
CREATE TABLE [tab] (
[name] varchar,
[order_by] int
)
表格中有10行,所有行都有相同的order_by值(假设它为0)
如果我然后发出以下SQL:
select * from [tab] order by [order_by]
行的顺序是什么?在这种情况下,什么因素决定了行顺序?
答案 0 :(得分:8)
没有定义。数据库可以按照它选择的任何顺序吐出它们,甚至可以改变查询之间的顺序(如果感觉就好)(它可能不会这样做,但你不应该依赖顺序一致)。
答案 1 :(得分:6)
如果您订购的列没有变化,则没有保证订单。
只要您想要定义订单,就需要一个良好的order by子句。我甚至无法想象为什么有人会使用orderby子句,如果所排序的列没有变化,或者为什么你甚至会有一个从不只有一个值的列。
答案 2 :(得分:4)
在这种情况下没有订单,因为您没有指定订单。
答案 3 :(得分:1)
我在现实生活中的经验是,当你没有指定任何顺序(或指定一个实际上不会导致排序的顺序,如本例中)时,行通常按照它们被添加到表中的顺序出现。但是,这绝不是保证,我永远不会依赖它。
答案 4 :(得分:1)
一般来说,除非指定order by子句,否则不能依赖于来自表的记录的顺序,并且不会对order by子句中的字段具有相同值的任何记录进行排序
话虽如此,有办法对将要出现的记录的顺序作出有根据的猜测。通常它们将按照表的聚集索引的顺序发出。这通常是主键,但并非总是如此。如果没有聚簇索引,那么它通常是插入顺序。请注意,您不能依赖这两件事。 SQL Server可能正在进行一些将改变顺序的优化。
答案 5 :(得分:0)
通常,您的表具有带有PKey的标识列。如果是这种情况那么那将是SQL Server 2008中的顺序。不幸的是,我经历过较旧版本的SQL Server倾向于给出不一致的结果,具体取决于您是通过OLEDB还是ODBC连接。
答案 6 :(得分:0)
如果'name'是主键,那么索引将具有指定的顺序(ASC或DESC)。这就是我认为你会在这种情况下看到的顺序。至少这是我在SQL 2008中观察到的行为。
如果'name'没有索引,那么我不相信订单可以预测。
编辑:
所以即使在我描述的情况下,看起来订单也不一定是可靠的。这里有一个更好的解释:SQL best practice to deal with default sort order
我认为,如果订单对您很重要,那么故事的寓意是指定订单。
答案 7 :(得分:0)
行的“自然”顺序是CLUSTERED索引所表示的顺序,如果您未指定顺序,则通常返回行的顺序。然而,企业版的旋转木马扫描意味着你不会总是按照这个顺序获得它们,并且正如一些人所说,你不应该依赖它。
如果您指定了订单,并且您订购的密钥对于一堆行是相同的,则根本不保证订单。