Sqlite LIMIT / OFFSET запит


153

У мене просте запитання з Sqlite. У чому різниця між цим:

Select * from Animals LIMIT 100 OFFSET 50

і

Select * from Animals LIMIT 100,50

9
Будь ласка, позначте це як відповідь, якщо він очистив ваші сумніви, як ви згадували в коментарях.
Мубашар

Відповіді:


270

Дві форми синтаксису є дещо заплутаними, оскільки вони перетворюють числа:

LIMIT <skip>, <count>

Еквівалентний:

LIMIT <count> OFFSET <skip>

Він сумісний із синтаксисом MySQL та PostgreSQL. MySQL підтримує обидві форми синтаксису, а його документи стверджують, що другий синтаксис із OFFSET мав на меті забезпечити сумісність з PostgreSQL. Документи PostgreSQL показують, що він підтримує лише другий синтаксис, а документи SQLite показують, що він підтримує обидва, рекомендуючи другий синтаксис, щоб уникнути плутанини.

До речі, використання LIMIT без попереднього використання ЗАМОВЛЕННЯ не завжди може дати вам бажані результати. На практиці SQLite повертає рядки в певному порядку, ймовірно, визначається тим, як вони фізично зберігаються у файлі. Але це не обов'язково означає, що це в потрібному вам порядку. Єдиний спосіб отримати передбачуване замовлення - це явно використовувати ЗАМОВЛЕННЯ.


2
LIMIT <count> OFFSET <skip>є більш зрозумілим. Дякую.
Guido Mocha

Подібна відповідь має гарне рішення з хорошими показниками, якщо порядок рядків має значення. stackoverflow.com/a/28860492/5016333
Rodrigo V

23

Останнє є альтернативним синтаксисом з одним застереженням :

Якщо замість ключового слова OFFSET використовується кома, то зміщення - це перше число, а межа - друге число. Це уявне протиріччя є навмисним - воно забезпечує максимальну сумісність із застарілими системами баз даних SQL.


5

Я зробив декілька тестів і різниці в продуктивності немає.

Це стосується лише порівнянності з іншими мовами 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 секунди


1
чому була б різниця у продуктивності? вони однакові!
Абхінав Гауніял
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.