代码之家  ›  专栏  ›  技术社区  ›  Thierry Roy

“select”是否始终按主键排序?

  •  16
  • Thierry Roy  · 技术社区  · 15 年前

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

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

    我使用Oracle作为数据库。

    6 回复  |  直到 11 年前
        1
  •  43
  •   BobbyShaftoe    15 年前

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

        2
  •  6
  •   Quassnoi    15 年前

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

    不,目前还不能保证。

    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
    
        3
  •  2
  •   Dave Costa    15 年前

    不,除非您使用订单,否则决不能保证订购。

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

        4
  •  0
  •   Roman    15 年前

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

    例如,在my table users中,每个用户都有唯一的varchar(20)字段-login和主键-id。

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

        5
  •  0
  •   pmcilreavy    15 年前

    如果您需要特定的排序,那么使用ORDER BY声明它。

    如果表没有主键怎么办?

        6
  •  0
  •   Eppz    15 年前

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