2010-07-24 83 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