2010-07-24 80 views
122

我对Sqlite有个简单的问题。是什么这之间的区别:Sqlite LIMIT/OFFSET查询

Select * from Animals LIMIT 100 OFFSET 50 

Select * from Animals LIMIT 100,50 
+9

0.001有所不同,请把它标记为答案,如果你在评论中提到已清除你的疑虑。 – 2015-02-16 11:55:53

回答

211

两个语法形式是有点混乱,因为他们扭转号:

LIMIT <skip>, <count> 

等同于:

LIMIT <count> OFFSET <skip> 

它与MySQL和PostgreSQL的语法兼容。 MySQL支持两种语法形式,并且它的docs声称带OFFSET的第二种语法是为了提供与PostgreSQL的兼容性。 PostgreSQL docs表明它只支持第二种语法,并且SQLite's docs表明它支持这两种语法,推荐第二种语法以避免混淆。

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

+0

嘿!非常感谢你!您已清除我的疑问 – Pablo 2010-07-24 15:40:19

+2

'LIMIT OFFSET '更清晰。谢谢。 – 2016-02-16 17:49:06

+0

如果行的顺序很重要,这个类似的答案有很好的解决方案和良好的性能。 http://stackoverflow.com/a/28860492/5016333 – 2016-03-19 00:30:00

19

后者是一种替代的语法与一个警告

如果使用逗号代替 OFFSET关键字,则该偏移量是 第一个数字和所述限制是 第二数量。这种看似 的矛盾是故意的 - 它 最大化与传统 SQL数据库系统的兼容性。

+0

非常感谢你! – Pablo 2010-07-24 15:41:46

6

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

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

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

我做了sqlite数据库与table1 100000行。我跑下一个测试

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

为什么会有性能差异?他们是一样的! – 2017-06-26 04:37:20