对所有 DBA 来说,一个基本的简单问题。
当我进行选择时,是否始终保证我的结果将按主键排序,还是应该使用“order by”指定它?
我使用 Oracle 作为我的数据库。
对所有 DBA 来说,一个基本的简单问题。
当我进行选择时,是否始终保证我的结果将按主键排序,还是应该使用“order by”指定它?
我使用 Oracle 作为我的数据库。
不,如果您不使用“order by”,则无法保证任何订购。事实上,您不能保证从一个查询到下一个查询的顺序是相同的。请记住,SQL 以基于集合的方式处理数据。现在,一个或另一个数据库实现可能碰巧以某种方式提供排序,但您永远不应该依赖它。
当我进行选择时,是否始终保证我的结果将按主键排序,还是应该使用“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
不,除非您使用 ORDER BY,否则无法保证订购。
获取行的顺序取决于访问方法(例如全表扫描、索引扫描)、表的物理属性、表中每一行的逻辑位置以及其他因素。即使您不更改查询,这些都可能发生变化,因此为了保证结果集中的顺序一致,ORDER BY 是必要的。
它取决于您的数据库,也取决于索引字段。
例如,在我的用户表中,每个用户都有唯一的 varchar(20) 字段 - 登录名和主键 - id。
并且“Select * from users”返回按登录排序的行集。
如果您需要特定的顺序,请使用 ORDER BY 专门声明它。
如果表没有主键怎么办?
如果您希望结果按特定顺序排列,请始终指定顺序