Sqlite LIMIT / OFFSET查询

我有一个简单的问题与Sqlite。 这有什么区别:

Select * from Animals LIMIT 100 OFFSET 50 

 Select * from Animals LIMIT 100,50 

这两种语法forms有点混淆,因为它们颠倒了数字:

 LIMIT <skip>, <count> 

相当于:

 LIMIT <count> OFFSET <skip> 

它与MySQL和PostgreSQL的语法兼容。 MySQL支持两种语法forms,其文档声称第二种带OFFSET的语法是为了提供与PostgreSQL的兼容性。 PostgreSQL 文档显示它只支持第二种语法, SQLite的文档显示它支持这两种语法,推荐第二种语法以避免混淆。

顺便说一下,在不首先使用ORDER BY的情况下使用LIMIT可能并不总是给你你想要的结果。 在实践中,SQLite将按照某种顺序返回行,这可能取决于它们是如何物理存储在文件中的。 但是,这并不一定意味着你想要的顺序。 获得可预测顺序的唯一方法是明确使用ORDER BY。

后者是一个备选语法,但需要注意一点

如果使用逗号代替OFFSET关键字,则偏移量是第一个数字,而限制是第二个数字。 这种看似矛盾是故意的 – 它最大限度地提高了与传统SQL数据库系统的兼容性。

我做了一些testing,性能没有什么不同。

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

两个版本的运行时间是一样的。

我做了100000行与table1 sqlite数据库。 我运行下一个testing

 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秒