Подтвердить что ты не робот

Запрос LIMIT/OFFSET Sqlite

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

Select * from Animals LIMIT 100 OFFSET 50

и

Select * from Animals LIMIT 100,50
4b9b3361

Ответ 1

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

LIMIT <skip>, <count>

Является эквивалентным:

LIMIT <count> OFFSET <skip>

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

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

Ответ 2

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

Если запятая используется вместо OFFSET, то смещение - это первое число, а предел - второе число. Это кажущееся противоречие преднамеренно - оно максимизирует совместимость с наследием SQL.

Ответ 3

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

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

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

Я сделал sqlite db со столом1 со 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 секунды