Відповіді:
Дві форми синтаксису є дещо заплутаними, оскільки вони перетворюють числа:
LIMIT <skip>, <count>
Еквівалентний:
LIMIT <count> OFFSET <skip>
Він сумісний із синтаксисом MySQL та PostgreSQL. MySQL підтримує обидві форми синтаксису, а його документи стверджують, що другий синтаксис із OFFSET мав на меті забезпечити сумісність з PostgreSQL. Документи PostgreSQL показують, що він підтримує лише другий синтаксис, а документи SQLite показують, що він підтримує обидва, рекомендуючи другий синтаксис, щоб уникнути плутанини.
До речі, використання LIMIT без попереднього використання ЗАМОВЛЕННЯ не завжди може дати вам бажані результати. На практиці SQLite повертає рядки в певному порядку, ймовірно, визначається тим, як вони фізично зберігаються у файлі. Але це не обов'язково означає, що це в потрібному вам порядку. Єдиний спосіб отримати передбачуване замовлення - це явно використовувати ЗАМОВЛЕННЯ.
LIMIT <count> OFFSET <skip>
є більш зрозумілим. Дякую.
Останнє є альтернативним синтаксисом з одним застереженням :
Якщо замість ключового слова OFFSET використовується кома, то зміщення - це перше число, а межа - друге число. Це уявне протиріччя є навмисним - воно забезпечує максимальну сумісність із застарілими системами баз даних SQL.
Я зробив декілька тестів і різниці в продуктивності немає.
Це стосується лише порівнянності з іншими мовами 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 секунди