17

对所有 DBA 来说,一个基本的简单问题。

当我进行选择时,是否始终保证我的结果将按主键排序,还是应该使用“order by”指定它?

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

4

6 回答 6

44

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

于 2009-05-05T13:29:23.597 回答
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
于 2009-05-05T13:30:44.153 回答
2

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

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

于 2009-05-05T13:32:39.877 回答
1

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

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

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

于 2009-05-05T13:31:04.543 回答
0

如果您需要特定的顺序,请使用 ORDER BY 专门声明它。

如果表没有主键怎么办?

于 2009-05-05T13:31:50.313 回答
0

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

于 2009-05-05T13:31:50.487 回答