Sqlite LIMIT / OFFSET запрос - PullRequest
       6

Sqlite LIMIT / OFFSET запрос

140 голосов
/ 24 июля 2010

У меня простой вопрос с Sqlite.В чем разница между этим:

Select * from Animals LIMIT 100 OFFSET 50

и

Select * from Animals LIMIT 100,50

Ответы [ 3 ]

247 голосов
/ 24 июля 2010

Две синтаксические формы немного сбивают с толку, потому что они переворачивают числа:

LIMIT <skip>, <count>

Эквивалентно:

LIMIT <count> OFFSET <skip>

Он совместим с синтаксисом из MySQL и PostgreSQL. MySQL поддерживает обе формы синтаксиса, и его docs утверждают, что второй синтаксис с OFFSET предназначен для обеспечения совместимости с PostgreSQL. PostgreSQL документы показывают, что он поддерживает только второй синтаксис, а документы SQLite показывают, что он поддерживает оба, рекомендует второй синтаксис, чтобы избежать путаницы.

Кстати, использование LIMIT без предварительного использования ORDER BY может не всегда дать вам ожидаемые результаты. На практике SQLite будет возвращать строки в некотором порядке, вероятно, в зависимости от того, как они физически хранятся в файле. Но это не обязательно означает, что это в том порядке, как вы хотите. Единственный способ получить предсказуемый порядок - явно использовать ORDER BY.

21 голосов
/ 24 июля 2010

Последний является альтернативным синтаксисом с одним предупреждением :

Если вместо ключевого слова OFFSET используется запятая, смещение является первым числом, а пределвторой номер.Это кажущееся противоречие является преднамеренным - оно максимизирует совместимость с устаревшими системами баз данных SQL.

6 голосов
/ 16 июля 2013

Я сделал несколько тестов, и нет разницы в производительности.

Это только для совместимости с другими языками SQL.

Время выполнения обеих версий одинаковое.

Я сделал sqlite db с 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,001 секунды

...