在SQL中,LIMIT是否按时间顺序返回插入最后一行的行?

时间:2017-01-11 11:01:00

标签: sql sqlite select limit

假设,如果按照时间顺序将以下行插入表中:

  

row1,row2,row3,row4,...,row1000,row1001。

过了一会儿,我们会删除/删除最新的row1001

如同这篇文章:How to get Top 5 records in SqLite?
如果运行以下命令:

SELECT * FROM <table> LIMIT 1;
  • 它肯定会提供“row1000”吗?
  • 如果没有,那么有没有有效的方法来获取最新的行 没有遍历所有行? - 即不使用 ORDER BYDESC的组合。

[注意:目前我使用的是“SQLite”,但我也很有兴趣了解SQL。]

3 个答案:

答案 0 :(得分:3)

没有。表记录没有固有的顺序。所以未定义哪个行使用LIMIT子句而没有ORDER BY

SQLite在其当前的实现中可能返回最新插入的行,但即使是这种情况,也不能依赖它。

如果记录顺序对您很重要,请为表提供日期时间列或某个排序键。

答案 1 :(得分:3)

您误解了SQL的工作原理。您正在考虑 逐行 ,这是错误的。 SQL &#34;遍历行&#34;根据你的关注;它对数据进行操作&#34;设置&#34;。

其他人指出,关系数据库 不能 被假定为具有任何特定排序,因此 必须使用 ORDER BY明确指定排序。

但是(尚未提及),为了确保其有效执行,您需要创建适当的索引。

无论您是否有索引,正确的查询是:

SELECT  <cols>
FROM    <table>
ORDER BY <sort-cols> [DESC] LIMIT <no-rows>

请注意,如果您没有索引,数据库将加载所有数据,并可能在内存中排序以查找TOP n。

如果您确实拥有相应的索引,数据库将使用可用的最佳索引来尽可能有效地检索TOP n行。

请注意,sqllite documentation在此事上非常明确。 ORDER BY部分解释了未定义排序。并且LIMIT部分中没有任何内容与此相矛盾(它只是限制了返回的行数)。

  

如果返回多行的SELECT语句没有ORDER BY子句,则返回行的顺序未定义

此行为也与ANSI标准和所有主要SQL实现一致。请注意,任何保证任何类型排序的数据库供应商都必须牺牲性能而不利于尝试检索数据但不关心订单的查询。 (对业务不利。

作为旁注,关于排序的有缺陷的假设是一个容易犯的错误(类似于关于未初始化的局部变量的错误假设)。

RDBMS实施很可能使订单 显示 一致。它们遵循用于添加数据的特定算法,用于检索数据的特定算法。因此,他们的操作非常 可重复 (这是我们对计算机的喜爱(和讨厌))。所以事情可以重复

理论范例:

  • 插入行会导致行被添加到下一个可用空间。因此数据显示顺序。但是如果不再适合,则更新必须将行移动到新位置。
  • 数据库引擎可以从聚集索引页面顺序检索数据,似乎以使用聚簇索引作为“自然顺序”#39; ...直到有一天,页面拆分将其中一个页面放在不同的位置。 *或者新版本的DMBS可能会缓存某些数据以提高性能,并突然改变订单。

真实世界的例子:

  • GROUP BY的MS SQL Server 6.5实现具有按分组列排序的副作用。当MS(版本7或2000)实现了一些性能改进时,GROUP BY默认情况下会以散列顺序返回数据。许多人指责MS打破他们的查询,实际上他们做出了错误的假设,但未能根据需要ORDER BY他们的结果。

这就是为什么特定排序的唯一保证是使用ORDER BY子句。

答案 2 :(得分:1)

在SQL中,数据存储在无序的表中。第一天出来的东西可能与下一天不一样。

ORDER BY或其他一些特定的选择标准需要保证正确的价值。