gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:22:23 26 4
gpt4 key购买 nike

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

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 的一般知识对我来说也会很有趣。]

最佳答案

您误解了 SQL 的工作原理。您在想逐行,这是错误的。 SQL 不会按照您的顾虑“遍历行”;它以“集合”的形式对数据进行操作。

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

但是(还没有提到),为了保证它高效的执行,你需要创建一个合适的索引。

不管你有没有索引,正确的查询是:

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

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

如果您确实有适当的索引,数据库将使用可用的最佳索引尽可能高效地检索前 n 行。


请注意 sqllite documentation对此事很清楚。 ORDER BY 部分解释了排序是未定义的。 LIMIT 部分中没有任何内容与此相矛盾(它只是限制返回的行数)。

If a SELECT statement that returns more than one row does not have an ORDER BY clause, the order in which the rows are returned is undefined.

此行为也符合 ANSI 标准和所有主要 SQL 实现。请注意,任何保证任何类型排序的数据库供应商都必须牺牲性能,以损害试图检索数据但不关心顺序的查询。 (对业务不利。)


附带说明一下,关于排序的错误假设很容易犯(类似于关于未初始化局部变量的错误假设)。

RDBMS 实现很可能使排序看起来一致。它们遵循某种算法来添加数据,某种算法来检索数据。因此,它们的操作具有高度可重复(这是我们对计算机的喜爱(和憎恨))。所以事情重复地看起来一样。

理论例子:

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

现实世界的例子:

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

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

关于sql - 在 SQL 中,LIMIT 是否返回按时间顺序最后插入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41589096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com