所有DBA的基本简单问题。
当我选择时,是否始终保证我的结果将由主键排序,或者我应该用'order by'指定它?
我正在使用Oracle作为我的数据库。
答案 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)
如果您希望结果按特定顺序排列,请始终按
指定订单