【问题标题】:what's order when select data from database?从数据库中选择数据时的顺序是什么?
【发布时间】:2010-02-02 19:57:55
【问题描述】:

假设我有一张桌子:

CREATE TABLE [tab] (
    [name] varchar,
    [order_by] int
)

表中有10行,所有行的order_by值都相同(假设为0)

如果我随后发出以下 SQL:

select * from [tab] order by [order_by]

行的顺序是什么?在这种情况下,什么因素决定了行顺序?

【问题讨论】:

  • @jinsungy:可能是,但也可能不是。这取决于数据库、存在哪些索引、表有多大等等......
  • 提示:不要依赖未定义的行为。
  • 谢谢,伙计们。每次发出 Select 时,我都会得到相同的订单,但我不知道 SQL Server 2008 在这种情况下如何决定订单。这不是您输入数据的顺序。很奇怪。
  • 如果没有 ORDER BY 子句,则无法保证订单。除其他事项外,查询中的微小更改可能会更改顺序。这并不奇怪 - 这是意料之中的。

标签: sql sql-server


【解决方案1】:

没有定义。数据库可以按照它选择的任何顺序将它们吐出,它甚至可以根据需要更改查询之间的顺序(它可能不会这样做,但你不应该依赖于顺序一致)。

【讨论】:

  • 正确的钱。订单未按定义定义:-)。永远不要假设任何特定的顺序。
【解决方案2】:

如果您订购的列没有变化,则没有保证顺序。

任何时候你想要一个定义好的顺序,你都需要一个好的 order by 子句。我什至无法想象如果被排序的列没有变化,为什么有人会使用 orderby 子句,或者为什么你甚至会有一个只有一个值的列。

【讨论】:

    【解决方案3】:

    在这种情况下没有订单,因为您没有指定订单。

    【讨论】:

      【解决方案4】:

      我在现实生活中的经验是,如果您不指定任何顺序(或指定实际上不会导致排序的顺序,如本例所示),行通常会按照它们添加到表中的顺序出现。但是,这绝不能保证,我永远不会依赖它。

      【讨论】:

      • 这肯定不会总是发生,你不应该依赖它。
      【解决方案5】:

      一般来说,除非您指定 order by 子句,否则您不能依赖表中记录的顺序,并且 order by 子句中的字段具有相同值的任何记录都不会被排序.

      话虽如此,有一些方法可以对将出现的记录的顺序进行有根据的猜测。通常它们会按照表的聚集索引的顺序发出。这通常是主键,但并非总是如此。如果没有聚集索引,则通常是插入顺序。请注意,您不能依赖其中任何一个。 SQL Server 可能正在做一些会改变顺序的优化。

      【讨论】:

        【解决方案6】:

        通常,您的表有一个带有 PKey 的标识列。如果是这种情况,那么这将是 SQL Server 2008 中的顺序。不幸的是,我遇到过旧版本的 SQL Server 往往会根据您是通过 OLEDB 还是 ODBC 连接而给出不一致的结果。

        【讨论】:

        • 如果没有 ORDER BY 子句,则无法保证订单。除其他外,查询中的微小更改可能会更改顺序。
        • 我同意,但问题与使用值都相同的 order by 子句有关。
        【解决方案7】:

        如果 'name' 是主键,则索引将具有指定的顺序(ASC 或 DESC)。这就是我认为你会在这种情况下看到的顺序。至少这是我在 SQL 2008 中观察到的行为。

        如果 'name' 没有索引,那么我不相信顺序是可预测的。

        编辑:

        因此,即使在我描述的情况下,订单似乎也不一定可靠。这里有更好的解释:SQL best practice to deal with default sort order

        我想这个故事的寓意是如果订单对您很重要,请指定订单。

        【讨论】:

        • 如果没有 ORDER BY 子句,则无法保证订单。除其他事项外,查询中的微小变化可能会改变顺序。
        【解决方案8】:

        行的“自然”顺序是 CLUSTERED 索引表示它们所在的顺序,如果您不指定顺序,这就是通常返回行的顺序。但是,企业版的旋转木马扫描意味着您不会总是按顺序获得它们,正如一些人所说,您永远不应该依赖它。

        如果您指定 order,并且您要订购的键对于一堆行是相等的,则根本无法保证 order。

        【讨论】:

          猜你喜欢
          • 2015-01-28
          • 2018-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-13
          • 2019-10-31
          • 2020-09-08
          • 1970-01-01
          相关资源
          最近更新 更多