Запрос Sqlite LIMIT / OFFSET

128

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

Select * from Animals LIMIT 100 OFFSET 50

и

Select * from Animals LIMIT 100,50
  • 9
    Пожалуйста, отметьте это как ответ, если он очистил ваши сомнения, как вы упомянули в комментариях.
Теги:
limit

3 ответа

239

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

LIMIT <skip>, <count>

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

LIMIT <count> OFFSET <skip>

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

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

  • 0
    Привет! Большое спасибо! Вы очистили мои сомнения
  • 2
    LIMIT <count> OFFSET <skip> более понятен. Спасибо.
Показать ещё 1 комментарий
21

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

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

6

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

Это только для совместимости с другими языками 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 секунды

  • 0
    с какой стати разница в производительности? они такие же!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню