Sqlite 限制/offSET 查询

我对 Sqlite 有一个简单的问题,它们之间的区别是什么:

Select * from Animals LIMIT 100 OFFSET 50

还有

Select * from Animals LIMIT 100,50
109064 次浏览

这两种语法形式有点混乱,因为它们颠倒了数字:

LIMIT <skip>, <count>

相当于:

LIMIT <count> OFFSET <skip>

它与 MySQL 和 PostgreSQL 的语法兼容。MySQL 同时支持这两种语法形式,而且它的 医生声称使用 OffSET 的第二种语法意在提供与 PostgreSQL 的兼容性。PostgreSQL医生显示它只支持第二种语法,而 SQLite 的文件显示它同时支持两种语法,建议使用第二种语法以避免混淆。

顺便说一下,在没有首先使用 ORDERBY 的情况下使用 LIMIT 可能不会总是给您想要的结果。实际上,SQLite 将以某种顺序返回行,这可能取决于它们在文件中的物理存储方式。但这并不意味着它就是你想要的顺序。获得可预测顺序的唯一方法是显式使用 ORDERBY。

后者是带有一个 警告的替代语法:

如果使用逗号代替 关键字,则偏移量为 第一个数字和限制是 第二个数字。这似乎 反传统是故意的 最大限度地提高与遗产的兼容性 SQL 数据库系统。

我做了一些测试,没有性能上的差异。

这只是为了与其他 sql 语言兼容。

两个版本的运行时是相同的。

我使用 table1创建了具有100000行的 sqlite db,然后运行下一个测试

long timeLimitOffset = 0;
long timeLimitComma = 0;
for (int i = 0; i < 100000; i++)
{
//first version
timeLimitOffset += SqlDuraction("Select * from table1  order by col1 LIMIT " + (i + 1) + " OFFSET " + (1001 - i) + "");
// second version
timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT " + (1001 - i) + " , " + (i + 1) + "");
}

时间变化只有0.001秒