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

时间:2009-05-05 13:28:45

标签: sql database oracle primary-key

所有DBA的基本简单问题。

当我选择时,是否始终保证我的结果将由主键排序,或者我应该用'order by'指定它?

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

6 个答案:

答案 0 :(得分:44)

不,如果您不使用“order by”,则不保证您有任何订购。实际上,您无法保证从一个查询到下一个查询的排序将是相同的。请记住,SQL以基于集合的方式处理数据。现在,一个或多个数据库实现可能会以某种方式提供排序,但您永远不应该依赖它。

答案 1 :(得分:6)

  

当我选择时,是否始终保证我的结果将由主键排序,或者我应该用'order by'指定它?

不,到目前为止还没有保证。

SELECT  *
FROM    table

很可能会使用根本不使用主键的TABLE SCAN

您可以使用提示:

SELECT  /*+ INDEX(pk_index_name) */
        *
FROM    table

,但即使在这种情况下也无法保证排序:如果使用Enterprise Edition,查询可能会并行化。

这是一个问题,因为ORDER BY不能在SELECT子句子查询中使用,你不能写这样的东西:

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

答案 2 :(得分:2)

不,除非您使用ORDER BY,否则永远无法保证订购。

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

答案 3 :(得分:0)

这取决于您的数据库,也取决于索引字段。

例如,在我的表中,每个用户都有唯一的varchar(20)字段 - 登录和主键 - id。

“Select * from users”返回按登录顺序排列的行集。

答案 4 :(得分:0)

如果您需要特定订购,请使用ORDER BY特别声明。

如果表没有主键怎么办?

答案 5 :(得分:0)

如果您希望结果按特定顺序排列,请始终按

指定订单