Sql 使用ORDER BY时可重复的结果
比如说,我们有一个ID列(唯一值)和代码(非唯一值)的表。没有插入/删除/更新操作,即它是一种常量。我们希望它按代码排序:Sql 使用ORDER BY时可重复的结果,sql,sql-order-by,Sql,Sql Order By,比如说,我们有一个ID列(唯一值)和代码(非唯一值)的表。没有插入/删除/更新操作,即它是一种常量。我们希望它按代码排序: select ID, Code from T1 order by Code 因此,我们得到如下结果: 4 'a' 9 'a' 1 'b' 3 'b' 9 'a' 4 'a' 1 'b' 3 'b' SQL标准或特定实现(那么是哪种实现)是否保证了后续选择中的ID顺序?我的意思是,我们没有得到这样的东西: 4 'a' 9 'a'
select ID, Code from T1 order by Code
因此,我们得到如下结果:
4 'a'
9 'a'
1 'b'
3 'b'
9 'a'
4 'a'
1 'b'
3 'b'
SQL标准或特定实现(那么是哪种实现)是否保证了后续选择中的ID顺序?我的意思是,我们没有得到这样的东西:
4 'a'
9 'a'
1 'b'
3 'b'
9 'a'
4 'a'
1 'b'
3 'b'
您可以通过以下方式保证:
select ID, Code from T1 order by Code, ID
只有在指定order BY时,才能保证行顺序
您是否有这样一个示例:您需要有保证的订单,但由于某种原因无法使用order BY?该订单仅由
order BY
子句保证。您必须向子句中添加另一列,以使结果可重复。您可以对这两列使用自己的排序
select id, code from t1 order by code asc, id asc
尽管默认值是升序,但我已经明确提到,可以将这两列的顺序分别指定为
asc或desc
如果数据库没有更改,那么您应该看到相同的结果,因为它们只会按照数据库中存在的顺序输出,如果没有插入/更新,DB没有理由对记录重新排序。但是,我不相信有任何保证,您可能会遇到一些记录在内存缓存中,而另一些不在内存缓存中的情况,这可能会改变顺序,具体取决于您使用的特定数据库引擎。SQL标准中没有指定的默认顺序。这意味着您的db引擎可以按照它选择的任何顺序(最有可能是最有效地返回行的顺序)自由返回行
给定此表结构,行很可能以插入顺序或主键顺序返回,但如果不指定
orderby
子句,就无法依赖它。除了orderby
子句中提供的内容之外,没有其他保证。尽管如此,一些数据库引擎将以一致的顺序返回数据。例如,网格分页,其中客户可以首先按任何列对数据进行排序。所以,如果他选择非唯一列,我们必须有可重复的选择结果,否则分页可能会跳过一些条目。