Sql “选择”是否总是按主键排序?

Sql “选择”是否总是按主键排序?,sql,database,oracle,primary-key,Sql,Database,Oracle,Primary Key,这是一个基本的简单问题,供各位DBA参考 当我进行选择时,是否总是保证我的结果将按主键排序,还是应该使用“排序依据”来指定它 我正在使用Oracle作为我的数据库。否,如果您不使用order by,则不保证任何订购。事实上,不能保证从一个查询到下一个查询的顺序是相同的。请记住,SQL是以基于集合的方式处理数据的。现在,一个或另一个数据库实现可能碰巧以某种方式提供排序,但您永远不应该依赖于此 当我进行选择时,是否总是保证我的结果将按主键排序,还是应该使用“排序依据”来指定它 不,到目前为止还不能保

这是一个基本的简单问题,供各位DBA参考

当我进行选择时,是否总是保证我的结果将按主键排序,还是应该使用“排序依据”来指定它


我正在使用Oracle作为我的数据库。

否,如果您不使用order by,则不保证任何订购。事实上,不能保证从一个查询到下一个查询的顺序是相同的。请记住,SQL是以基于集合的方式处理数据的。现在,一个或另一个数据库实现可能碰巧以某种方式提供排序,但您永远不应该依赖于此

当我进行选择时,是否总是保证我的结果将按主键排序,还是应该使用“排序依据”来指定它

不,到目前为止还不能保证

SELECT  *
FROM    table
最有可能使用的是完全不使用主键的表扫描

您可以使用提示:

SELECT  /*+ INDEX(pk_index_name) */
        *
FROM    table
,但即使在这种情况下,也不能保证排序:如果使用Enterprise Edition,查询可能会并行化

这是一个问题,因为不能在SELECT子句子查询中使用ORDER BY,并且不能编写如下内容:

SELECT  (
        SELECT  column
        FROM    table
        WHERE   rownum = 1
        ORDER BY
                other_column
        )
FROM    other_table

它取决于数据库,也取决于索引字段

例如,在my表Users中,每个用户都有唯一的varchar20字段-login和主键-id


并选择*from users返回按登录顺序排列的行集

如果您需要特定的排序,请使用ORDER BY明确声明


如果表没有主键怎么办?

如果希望结果按特定顺序排列,请始终按指定的顺序排列。否,除非使用按指定的顺序排列,否则无法保证排序


获取行的顺序取决于访问方法,例如全表扫描、索引扫描、表的物理属性、表中每行的逻辑位置以及其他因素。即使您不更改查询,这些都可能更改,因此,为了保证结果集中的顺序一致,必须按顺序排序。

是否有可能按聚集索引的顺序返回记录?这是一个很好的机会,但不能保证。涉及连接、视图、子查询等的复杂查询可能会使结果集的顺序大不相同。它有时可能以聚集索引顺序返回,有时则不以聚集索引顺序返回。如果你想要一个特定的订单,一定要使用order by。有机会吗?是的,在0到100%之间,一个足够大的范围,你不应该依赖它。尽可能使用标准SQL语法和行为,这大大简化了在多个DBMS供应商之间移动和/或支持多个DBMS供应商的任务我不是说不要针对特定供应商进行优化,只是要对此发疯-使用一些常识,不管它看起来有多么不寻常:-。我继承了一个软件,如果Oracle返回的数据不是按主键排序的,它就会失败,而且它从来没有失败过。当然,这是一个糟糕的软件,仅仅提到它是因为Oracle看起来非常一致。如果表没有主键,那么除了返回数据的顺序之外,您还有其他问题。总体而言,这并不能阻止人们糟糕地设计表!没问题:从表中选择第一个\u值列与另一个\u列的顺序不同@杰弗里:这是可能的,但是子查询会选择所有的第一个值,并对它们进行散列。如果子查询返回大量行,这将降低所有性能。可能重复