LIMIT memotong hasil query jadi beberapa baris pertama saja, dan OFFSET melewati sejumlah baris dulu sebelum mulai mengambil. Bayangin hasil pencarian di toko online: barangnya ribuan, tapi satu halaman cuma menampilkan 10. Halaman 1 mengambil 10 pertama, halaman 2 melewati 10 lalu mengambil 10 berikutnya. Itu LIMIT 10 dan OFFSET 10.
🧪 Tebakan cepat: apakah
SELECT * FROM students LIMIT 3;memberi 3 siswa dengan nilai tertinggi? Tebak dulu, jawabannya ada di bagian "LIMIT tanpa ORDER BY".
LIMIT: ambil N baris pertama
Tabel students di Lab dan latihan berisi 7 siswa:
| id | name | grade | city |
|---|---|---|---|
| 1 | Dewi | 90 | Jakarta |
| 2 | Rizky | 85 | Bandung |
| 3 | Maya | 92 | Surabaya |
| 4 | Andi | 78 | Jakarta |
| 5 | Budi | 88 | Bandung |
| 6 | Citra | 95 | Yogyakarta |
| 7 | Dimas | 82 | Semarang |
Tiga nilai tertinggi:
SELECT * FROM students
ORDER BY grade DESC
LIMIT 3;
| id | name | grade | city |
|---|---|---|---|
| 6 | Citra | 95 | Yogyakarta |
| 3 | Maya | 92 | Surabaya |
| 1 | Dewi | 90 | Jakarta |
ORDER BY grade DESCmenyusun ketujuh baris dari nilai terbesar.LIMIT 3lalu memotong hasil yang sudah urut itu, jadi tinggal 3 baris teratas.- Urutannya penting: urutkan dulu, baru potong.
LIMIT tanpa ORDER BY
SELECT * FROM students LIMIT 3;
Hasilnya Dewi, Rizky, Maya: 3 baris pertama sesuai urutan SQLite menyimpannya. Itu jawaban tebakannya: tanpa ORDER BY, LIMIT 3 cuma "3 baris mana saja", bukan 3 terbaik. Citra (95) gak ikut sama sekali.
OFFSET: lewati dulu, baru ambil
OFFSET melewati sejumlah baris dari hasil yang sudah urut. Dengan 3 siswa per halaman:
| Halaman | Query | Hasil |
|---|---|---|
| 1 | LIMIT 3 OFFSET 0 |
Citra, Maya, Dewi |
| 2 | LIMIT 3 OFFSET 3 |
Budi, Rizky, Dimas |
| 3 | LIMIT 3 OFFSET 6 |
Andi |
Rumusnya: OFFSET = (halaman - 1) × LIMIT. Halaman 3 berarti (3 - 1) × 3 = 6 baris dilewati. Halaman terakhir boleh kurang dari 3 baris: di sini tinggal Andi.
OFFSET 0sama dengan gak menulisOFFSET. Hitungannya mulai dari 0, jadiOFFSET 10artinya mulai dari baris ke-11.LIMIT 3 OFFSET 0di tabel 10 baris memberi tepat 3 baris.- Halaman di luar data bukan error.
LIMIT 5 OFFSET 10di tabel 7 baris memberi 0 baris.
Urutan klausa
Klausa ditulis dengan urutan tetap: SELECT, FROM, WHERE, ORDER BY, LIMIT, OFFSET. Kalau tertukar, SQLite menolak:
SELECT * FROM students LIMIT 3 ORDER BY grade DESC;dijawabnear "ORDER": syntax error.SELECT * FROM students OFFSET 3;dijawabnear "OFFSET": syntax error. Di SQLite,OFFSETselalu ikutLIMIT.
💡 Beda SQLite, MySQL, dan PostgreSQL
LIMIT 3 OFFSET 3jalan di ketiganya.LIMIT 3, 3(pakai koma) dipahami MySQL dan SQLite: angka pertama itu OFFSET, angka kedua jumlah barisnya. PostgreSQL menolak bentuk ini. BentukLIMIT ... OFFSET ...lebih jelas dibaca.OFFSETtanpaLIMITboleh di PostgreSQL, tapi ditolak SQLite dan MySQL.
⚠️ Jebakan yang sering ketemu
- LIMIT tanpa ORDER BY. Hasilnya baris mana saja, bukan yang terbaik atau terbaru.
- OFFSET mulai dari 1. Halaman 1 itu
OFFSET 0.OFFSET 1justru melewati baris pertama. - Nilai seri di batas halaman. Kalau baris ke-3 dan ke-4 nilainya sama, tambahkan kunci kedua di
ORDER BYsupaya halamannya gak berubah-ubah. - OFFSET yang sangat besar.
OFFSET 100000tetap membaca lalu membuang 100.000 baris dulu, jadi makin lambat di halaman jauh.
TL;DR: LIMIT n mengambil n baris pertama dari hasil query, OFFSET m melewati m baris dulu. Selalu urutkan dulu dengan ORDER BY, kalau gak, "3 teratas" cuma 3 baris sembarang. Untuk halaman: LIMIT ukuran OFFSET (halaman - 1) × ukuran, dan halaman 1 itu OFFSET 0. Urutan klausa: WHERE, ORDER BY, LIMIT, OFFSET.