Sqlite LIMIT / OFFSET query

153

Saya punya pertanyaan sederhana dengan Sqlite. Apa perbedaan antara ini:

Select * from Animals LIMIT 100 OFFSET 50

dan

Select * from Animals LIMIT 100,50
Pablo
sumber
9
Silakan tandai sebagai jawaban jika telah menghapus keraguan Anda seperti yang Anda sebutkan di komentar.
Mubashar

Jawaban:

270

Dua bentuk sintaksis sedikit membingungkan karena mereka membalikkan angka:

LIMIT <skip>, <count>

Setara dengan:

LIMIT <count> OFFSET <skip>

Ini kompatibel dengan sintaksis dari MySQL dan PostgreSQL. MySQL mendukung kedua bentuk sintaks, dan dokumennya mengklaim bahwa sintaks kedua dengan OFFSET dimaksudkan untuk memberikan kompatibilitas dengan PostgreSQL. Dokumen PostgreSQL hanya menunjukkan sintaksis kedua, dan dokumen SQLite menunjukkan bahwa keduanya mendukung keduanya, merekomendasikan sintaksis kedua untuk menghindari kebingungan.

Omong-omong, menggunakan LIMIT tanpa terlebih dahulu menggunakan ORDER BY mungkin tidak selalu memberi Anda hasil yang Anda inginkan. Dalam praktiknya, SQLite akan mengembalikan baris dalam urutan tertentu, mungkin ditentukan oleh cara mereka secara fisik disimpan dalam file. Tetapi ini tidak berarti bahwa itu sesuai dengan urutan yang Anda inginkan. Satu-satunya cara untuk mendapatkan pesanan yang dapat diprediksi adalah dengan menggunakan ORDER BY secara eksplisit.

Bill Karwin
sumber
2
LIMIT <count> OFFSET <skip>lebih jelas. Terima kasih.
Guido Mocha
Jawaban serupa ini memiliki solusi yang baik dengan kinerja yang baik jika urutan baris penting. stackoverflow.com/a/28860492/5016333
Rodrigo V
23

Yang terakhir adalah sintaks alternatif dengan satu peringatan :

Jika koma digunakan sebagai pengganti kata kunci OFFSET, maka offset adalah angka pertama dan batasnya adalah angka kedua. Kontradisi ini tampaknya disengaja - memaksimalkan kompatibilitas dengan sistem database SQL lama.

Nick Dandoulakis
sumber
5

Saya melakukan beberapa tes dan tidak ada perbedaan kinerja.

Itu hanya untuk kompatibilitas dengan bahasa sql lainnya.

Waktu menjalankan kedua versi adalah sama.

Saya membuat sqlite db dengan table1 dengan 100000 baris. Saya menjalankan tes berikutnya

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) + "");
}

Waktu bervariasi untuk 0,001 detik

Kalanj Djordje Djordje
sumber
1
mengapa ada perbedaan kinerja? mereka sama!
Abhinav Gauniyal