我对Sqlite有一个简单的问题.这有什么区别:
Select * from Animals LIMIT 100 OFFSET 50
和
Select * from Animals LIMIT 100,50
Bill Karwin.. 254
这两种语法形式有点混乱,因为它们反转了数字:
LIMIT,
相当于:
LIMITOFFSET
它与MySQL和PostgreSQL的语法兼容.MySQL支持两种语法形式,其文档声称使用OFFSET的第二种语法旨在提供与PostgreSQL的兼容性.PostgreSQL 文档显示它只支持第二种语法,而SQLite的文档显示它支持两者,推荐第二种语法以避免混淆.
顺便说一句,在没有首先使用ORDER BY的情况下使用LIMIT可能并不总能为您提供所需的结果.实际上,SQLite将按某种顺序返回行,这可能取决于它们如何物理存储在文件中.但这并不一定意味着它按照你想要的顺序排列.获得可预测顺序的唯一方法是显式使用ORDER BY.
这两种语法形式有点混乱,因为它们反转了数字:
LIMIT,
相当于:
LIMITOFFSET
它与MySQL和PostgreSQL的语法兼容.MySQL支持两种语法形式,其文档声称使用OFFSET的第二种语法旨在提供与PostgreSQL的兼容性.PostgreSQL 文档显示它只支持第二种语法,而SQLite的文档显示它支持两者,推荐第二种语法以避免混淆.
顺便说一句,在没有首先使用ORDER BY的情况下使用LIMIT可能并不总能为您提供所需的结果.实际上,SQLite将按某种顺序返回行,这可能取决于它们如何物理存储在文件中.但这并不一定意味着它按照你想要的顺序排列.获得可预测顺序的唯一方法是显式使用ORDER BY.
后者是一种替代语法,但有一点需要注意:
如果使用逗号而不是OFFSET关键字,则偏移量是第一个数字,限制是第二个数字.这种看似矛盾是有意的 - 它最大限度地提高了与传统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秒