Sqlite LIMIT/OFFSET查询

Pab*_*blo 144 sqlite limit

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

Select * from Animals LIMIT 100 OFFSET 50
Run Code Online (Sandbox Code Playgroud)

Select * from Animals LIMIT 100,50
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 254

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

LIMIT <skip>, <count>
Run Code Online (Sandbox Code Playgroud)

相当于:

LIMIT <count> OFFSET <skip>
Run Code Online (Sandbox Code Playgroud)

它与MySQL和PostgreSQL的语法兼容.MySQL支持两种语法形式,其文档声称使用OFFSET的第二种语法旨在提供与PostgreSQL的兼容性.PostgreSQL 文档显示它只支持第二种语法,而SQLite的文档显示它支持两者,推荐第二种语法以避免混淆.

顺便说一句,在没有首先使用ORDER BY的情况下使用LIMIT可能并不总能为您提供所需的结果.实际上,SQLite将按某种顺序返回行,这可能取决于它们如何物理存储在文件中.但这并不一定意味着它按照你想要的顺序排列.获得可预测顺序的唯一方法是显式使用ORDER BY.

  • `LIMIT <count> OFFSET <skip>`更清楚.谢谢. (2认同)

Nic*_*kis 22

后者是一种替代语法,但有一点需要注意:

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


Kal*_*dje 6

我做了一些测试,性能没有差别.

这只是为了与其他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) + "");
}
Run Code Online (Sandbox Code Playgroud)

时间变化0.001秒

  • 为什么会有性能差异?他们是一样的! (2认同)