LIMIT dan OFFSET SQL: Ambil Sebagian Data buat Pagination
TL;DR
LIMIT adalah klausa SQL yang membatasi berapa baris yang dikembalikan query, sedangkan OFFSET menentukan berapa baris yang dilewati dari awal. Kombinasi keduanya dipakai buat pagination, dengan rumus OFFSET = (nomor_halaman - 1) dikali jumlah baris per halaman. LIMIT dan OFFSET wajib dipasangkan dengan ORDER BY, karena tanpa itu urutan barisnya nggak dijamin konsisten.
LIMIT ngatur berapa baris yang diambil query. OFFSET ngatur berapa baris yang dilewati dulu. Gabungin keduanya, dan kamu dapat pagination — tombol halaman 1, 2, 3 yang ada di hampir semua aplikasi.
Ada satu aturan yang gampang dilupain: LIMIT tanpa ORDER BY itu bahaya. Query yang sama bisa ngasih baris berbeda tiap kali dijalanin.
Di bawah ada sintaksnya, rumus pagination, perbedaan antar database, dan alasan kenapa OFFSET yang gede bikin aplikasi kamu melambat di halaman belakang.
Apa itu LIMIT dan OFFSET di SQL?
LIMIT adalah klausa yang membatasi berapa banyak baris yang dikembalikan query. OFFSET adalah klausa yang menentukan berapa banyak baris yang dilewati sebelum pengambilan dimulai.
SELECT kolom
FROM tabel
ORDER BY kolom_pengurut
LIMIT jumlah_baris OFFSET jumlah_yang_dilewati;
LIMIT 5 OFFSET 10 artinya: lewati 10 baris pertama, lalu ambil 5 baris berikutnya. Hasilnya baris ke-11 sampai ke-15.
Kalau OFFSET nggak ditulis, nilainya nol. Query mulai dari baris pertama.
Tabel latihan: toko_berkah
CREATE TABLE transaksi (
id INT PRIMARY KEY,
tanggal DATE NOT NULL,
kota VARCHAR(50),
kategori VARCHAR(50),
produk VARCHAR(100),
total DECIMAL(12,2)
);
INSERT INTO transaksi (id, tanggal, kota, kategori, produk, total) VALUES
(1, '2026-01-03', 'Surabaya', 'Minuman', 'Kopi Sachet Gula Aren', 25000.00),
(2, '2026-01-03', 'Bandung', 'Snack', 'Keripik Singkong', 60000.00),
(3, '2026-01-04', 'Surabaya', 'Minuman', 'Teh Kotak', 96000.00),
(4, '2026-01-05', 'Jakarta', 'Sembako', 'Beras Premium 5kg', 225000.00),
(5, '2026-01-06', 'Bandung', 'Minuman', 'Kopi Susu Botol', 108000.00),
(6, '2026-01-07', 'Jakarta', 'Snack', 'Biskuit Kaleng', 110000.00),
(7, '2026-01-08', 'Surabaya', 'Sembako', 'Minyak Goreng 2L', 228000.00),
(8, '2026-01-09', 'Bandung', 'Minuman', 'Kopi Sachet Gula Aren', 50000.00),
(9, '2026-01-10', 'Jakarta', 'Minuman', 'Teh Kotak', 72000.00),
(10, '2026-01-11', 'Surabaya', 'Snack', 'Keripik Singkong', 36000.00);
Gimana rumus pagination-nya?
Ini rumus yang dipakai hampir semua aplikasi:
OFFSET = (nomor_halaman - 1) x jumlah_baris_per_halaman
Misalnya kamu nampilin 5 baris per halaman:
| Halaman | OFFSET | Query | Baris ke- |
|---|---|---|---|
| 1 | 0 | LIMIT 5 OFFSET 0 | 1–5 |
| 2 | 5 | LIMIT 5 OFFSET 5 | 6–10 |
| 3 | 10 | LIMIT 5 OFFSET 10 | 11–15 |
| 4 | 15 | LIMIT 5 OFFSET 15 | 16–20 |
Halaman pertama selalu OFFSET nol, soalnya nggak ada yang perlu dilewati.
Kenapa LIMIT wajib dipasangkan sama ORDER BY?
Ini bagian yang paling sering diabaikan pemula.
-- BAHAYA: 5 baris apa? Nggak ada yang tau.
SELECT id, produk FROM transaksi LIMIT 5;
Tanpa ORDER BY, database bebas ngasih baris dalam urutan apa pun yang paling cepat buat dia. Bisa berubah antar eksekusi, apalagi setelah data nambah atau query jalan paralel.
Efeknya di pagination lebih parah lagi: satu baris bisa muncul di halaman 1 dan halaman 2, sementara baris lain nggak pernah muncul sama sekali. User bingung, kamu bingung, dan bug-nya nggak pernah ngasih error.
-- BENAR
SELECT id, produk FROM transaksi
ORDER BY id
LIMIT 5 OFFSET 5;
Kolom pengurutnya harus unik atau punya pemecah seri. Detail sortirnya ada di artikel ORDER BY.
Sintaksnya beda-beda tiap database
| Database | Sintaks |
|---|---|
| PostgreSQL, SQLite | LIMIT 5 OFFSET 10 |
| MySQL | LIMIT 5 OFFSET 10 atau LIMIT 10, 5 |
| SQL Server 2012+ | OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY |
| SQL Server lama | SELECT TOP 5 ... |
| Oracle 12c+ | OFFSET 10 ROWS FETCH FIRST 5 ROWS ONLY |
Hati-hati sama bentuk pendek MySQL: LIMIT 10, 5. Angka pertama itu OFFSET, angka kedua LIMIT — urutannya kebalik dari yang kamu duga. Aku pribadi selalu nulis versi panjangnya biar nggak salah baca enam bulan kemudian.
Bentuk OFFSET ... FETCH adalah sintaks standar SQL, dan PostgreSQL juga mendukungnya. Kalau query kamu harus jalan di banyak database, pakai itu.
LIMIT buat Top N dan runner-up
-- 3 produk termahal
SELECT produk, total FROM transaksi
ORDER BY total DESC
LIMIT 3;
-- Juara 2 dan 3 (lewati juara 1)
SELECT produk, total FROM transaksi
ORDER BY total DESC
LIMIT 2 OFFSET 1;
Query kedua ngasih Beras Premium 5kg (225.000) dan Biskuit Kaleng (110.000) — Minyak Goreng 2L yang jadi juara 1 dilewati.
Kenapa OFFSET besar bikin query lambat?
Ini yang bikin aplikasi terasa cepat di halaman 1 dan lemot di halaman 500.
Database nggak bisa langsung lompat ke baris ke-100.001. Dia tetap harus baca 100.000 baris pertama, buang semuanya, baru ngasih 20 baris yang kamu minta. Kerja buang-buang itu nggak gratis.
Di tabel transaksi dengan 2 juta baris, OFFSET 0 bisa selesai dalam 3 milidetik, sementara OFFSET 1900000 makan waktu ratusan kali lipat — padahal jumlah baris yang dikembalikan sama persis.
Alternatifnya: keyset pagination
Ganti OFFSET dengan filter WHERE berdasarkan nilai terakhir dari halaman sebelumnya.
-- Halaman 1
SELECT id, produk, total FROM transaksi
ORDER BY id
LIMIT 5;
-- Baris terakhir: id = 5
-- Halaman 2: mulai dari yang id-nya di atas 5
SELECT id, produk, total FROM transaksi
WHERE id > 5
ORDER BY id
LIMIT 5;
Database bisa langsung lompat ke posisi itu pakai index, tanpa baca satu pun baris sebelumnya. Halaman ke-5000 secepat halaman pertama.
Kelemahannya: kamu nggak bisa lompat ke halaman sembarangan. Cuma bisa "berikutnya" dan "sebelumnya". Itu alasan aplikasi dengan infinite scroll — Instagram, Tokopedia, feed marketplace — hampir semua pakai cara ini, bukan OFFSET.
Kesalahan umum
- LIMIT tanpa ORDER BY. Hasilnya nggak bisa dipercaya. Selalu pasangkan.
- Ngurutin pakai kolom yang nggak unik. Kalau banyak baris punya tanggal sama, urutan di dalamnya masih acak. Tambahin pemecah seri:
ORDER BY tanggal, id. - Ketuker urutan di
LIMIT 10, 5MySQL. Angka pertama itu OFFSET. - Pakai OFFSET buat halaman ke-1000 di tabel jutaan baris. Pindah ke keyset pagination.
Referensi klausanya ada di halaman fungsi LIMIT dan glosarium pagination. Sintaks resminya di dokumentasi PostgreSQL soal LIMIT dan OFFSET.
FAQ LIMIT dan OFFSET SQL
Apa bedanya LIMIT dan OFFSET?
LIMIT nentuin berapa banyak baris yang dikembalikan, OFFSET nentuin berapa banyak baris yang dilewati dari awal. LIMIT 5 OFFSET 10 artinya lewati 10 baris pertama, lalu ambil 5 baris berikutnya — baris ke-11 sampai ke-15. Kalau OFFSET nggak ditulis, nilainya dianggap nol.
Gimana rumus OFFSET untuk pagination?
OFFSET sama dengan nomor halaman dikurangi satu, lalu dikali jumlah baris per halaman. Kalau kamu nampilin 20 baris per halaman dan user minta halaman 4, OFFSET-nya (4 - 1) dikali 20 sama dengan 60. Jadi query-nya LIMIT 20 OFFSET 60. Halaman pertama selalu OFFSET nol.
Kenapa OFFSET besar bikin query lambat?
Karena database tetap harus baca dan buang semua baris yang dilewati. OFFSET 100000 artinya dia ngambil 100 ribu baris pertama, lalu membuangnya, baru ngasih yang kamu minta. Di tabel besar, halaman 5000 bisa jauh lebih lambat dari halaman 1 — padahal jumlah baris yang dikembalikan sama.
Apakah LIMIT jalan di semua database?
Nggak. LIMIT dan OFFSET dipakai PostgreSQL, MySQL, dan SQLite. SQL Server pakai OFFSET ... ROWS FETCH NEXT ... ROWS ONLY, dan versi lama pakai TOP. Oracle 12c ke atas juga pakai FETCH FIRST. Sintaks OFFSET FETCH adalah bentuk standar SQL.
Apa alternatif OFFSET untuk data besar?
Keyset pagination, sering disebut cursor pagination. Ganti OFFSET dengan filter WHERE berdasarkan nilai terakhir dari halaman sebelumnya, misalnya WHERE id > 500 lalu LIMIT 20. Database bisa langsung lompat ke posisi itu pakai index. Kelemahannya, kamu nggak bisa lompat ke halaman sembarangan.
Rangkuman
LIMIT nentuin berapa yang diambil, OFFSET nentuin berapa yang dilewati. Rumus pagination-nya: OFFSET = (halaman - 1) x baris per halaman.
Selalu pasangkan sama ORDER BY, dan pakai kolom pengurut yang unik.
Kalau tabelnya udah jutaan baris dan user sering buka halaman belakang, pindah ke keyset pagination. Query-nya sedikit lebih ribet, tapi kecepatannya nggak turun di halaman berapa pun.
Copy tabel transaksi di atas, terus coba jalanin LIMIT 5 tanpa ORDER BY beberapa kali. Lihat sendiri apakah urutannya konsisten.
Lanjut ke ORDER BY SQL kalau kamu belum yakin soal pengurutan.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
7 SQL Client Gratis Terbaik buat Analis Data (2026)
Nggak perlu bayar buat nulis query. Ini 7 SQL client gratis yang beneran dipakai analis, plus kelebihan dan kekurangannya masing-masing.
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Sepuluh aturan SQL style guide yang bikin query kamu kebaca sama tim — dan sama kamu sendiri 6 bulan lagi. Lengkap dengan contoh sebelum-sesudah.
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Contoh soal take-home test SQL yang beneran dipakai perusahaan, dikerjain step by step — dari baca soal, nulis query, sampai nyusun insight yang bikin recruiter nengok.