MySQL LIMIT & OFFSET dengan Contoh
⚡ Ringkasan Cerdas
The MySQL Kata kunci LIMIT membatasi jumlah baris yang dikembalikan oleh kueri, dan nilai OFFSET menentukan baris mana yang menjadi titik awal hasil. Bersama-sama, keduanya menjaga agar kumpulan hasil tetap kecil, mempercepat pemuatan halaman, dan mendorong paginasi data per data.

Apa arti kata kunci LIMIT dalam MySQL?
The MEMBATASI Kata kunci `limits` membatasi jumlah baris yang dikembalikan dalam hasil kueri. Kata kunci ini dapat digunakan dengan pernyataan SELECT, UPDATE, dan DELETE, sehingga membatasi jumlah baris yang dibaca oleh kueri serta jumlah baris yang dipengaruhi oleh penulisan.
Sintaks untuk kata kunci LIMIT adalah sebagai berikut.
SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;
SINI
- “PILIH {nama bidang | *} DARI Nama tabel” adalah PILIH pernyataan berisi bidang yang ingin kami kembalikan dalam kueri kami.
- “[Kondisi MANA]” bersifat opsional, tetapi jika diberikan, akan menentukan filter pada kumpulan hasil. klausa WHERE diterapkan sebelum LIMIT, jadi penyaringan terjadi terlebih dahulu dan batasan diterapkan pada apa yang lolos.
- “BATAS N” adalah kata kuncinya, dan N N adalah angka apa pun yang dimulai dari 0. Memasukkan 0 sebagai batas tidak akan menghasilkan catatan sama sekali. Memasukkan angka seperti 5 akan menghasilkan lima catatan. Jika tabel berisi catatan kurang dari N, semua catatan akan dikembalikan dan tidak akan muncul kesalahan.
Sintaksnya singkat, tetapi alasan keberadaannya perlu dijelaskan sebelum contoh-contohnya.
Mengapa Kita Harus Menggunakan Kata Kunci LIMIT?
Misalkan kita sedang mengembangkanping Aplikasi yang berjalan di atas myflixdb. Para perancang sistem meminta kami untuk membatasi jumlah data yang ditampilkan per halaman menjadi 20 data, untuk mengatasi waktu pemuatan yang lambat. Bagaimana cara kami mengimplementasikan sistem yang memenuhi persyaratan tersebut?
Kata kunci LIMIT menangani situasi ini dengan tepat. Alih-alih menarik setiap baris anggota ke dalam aplikasi dan membuang sebagian besar di antaranya, kueri mengembalikan 20 catatan per halaman dan basis data yang melakukan pekerjaannya. Tiga manfaat berikut ini muncul dari hal tersebut.
- Respon lebih cepat: Lebih sedikit data yang dibaca dari disk dan lebih sedikit data yang melewati jaringan.
- Penggunaan memori lebih rendah: Aplikasi ini hanya menyimpan satu halaman baris, bukan seluruh tabel.
- Safer menulis: BATASAN pada PEMBARUAN atau DELETE Pernyataan tersebut membatasi berapa banyak baris yang dapat terpengaruh oleh kesalahan.
MySQL Contoh Kueri LIMIT
Contoh-contoh di bawah ini dijalankan terhadap tabel anggota di basis data myflixdb. Contoh pertama mengembalikan dua baris dan tidak lebih.
SELECT * FROM members LIMIT 2;
| Nomor keanggotaan | nama lengkap | jenis kelamin | tanggal_lahir | tanggal_pendaftaran | alamat fisik | alamat pos_ | nomor kontak | nomor_kartu_kredit | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Perempuan | 21-07-1980 | NULL | Plot Jalan Pertama No 4 | Tas Pribadi | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Perempuan | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
Seperti yang ditunjukkan hasil di atas, hanya dua anggota yang telah dikembalikan.
Mendapatkan daftar sepuluh (10) anggota dari basis data
Misalkan kita menginginkan daftar 10 anggota terdaftar pertama dari basis data Myflix. Skrip di bawah ini meminta data tersebut.
SELECT * FROM members LIMIT 10;
Menjalankan skrip tersebut memberikan hasil seperti yang ditunjukkan di bawah ini.
| Nomor keanggotaan | nama lengkap | jenis kelamin | tanggal_lahir | tanggal_pendaftaran | alamat fisik | alamat pos_ | nomor kontak | nomor_kartu_kredit | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Perempuan | 21-07-1980 | NULL | Plot Jalan Pertama No 4 | Tas Pribadi | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Perempuan | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Pria | 12-07-1989 | NULL | Jalan ke-3 34 | NULL | 12345 | rm@tstreet.com | NULL |
| 4 | Gloria Williams | Perempuan | 14-02-1984 | NULL | Jalan ke-2 23 | NULL | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Pria | NULL | NULL | jambul kayu | NULL | 845738767 | NULL | NULL |
| 6 | Sheldon Cooper | Pria | NULL | NULL | jambul kayu | NULL | 976736763 | NULL | NULL |
| 7 | Rajesh Koothrappali | Pria | NULL | NULL | jambul kayu | NULL | 938867763 | NULL | NULL |
| 8 | Leslie Winkle | Pria | 14-02-1984 | NULL | jambul kayu | NULL | 987636553 | NULL | NULL |
| 9 | Howard Wolowitz | Pria | 24-08-1981 | NULL | Taman Selatan | PO Box 4563 | 987786553 | lwolowitz[at]email.me | NULL |
Hanya 9 anggota yang dikembalikan, karena N dalam klausa LIMIT lebih besar dari jumlah catatan dalam tabel. Meminta 9 baris secara eksplisit menghasilkan kumpulan hasil yang sama.
SELECT * FROM members LIMIT 9;
💡 Kiat: LIMIT memilih baris dari urutan apa pun yang dihasilkan server. Tambahkan sebuah DIPESAN OLEH klausa ini berlaku setiap kali identitas baris menjadi penting, jika tidak, "10 anggota pertama" tidak dijamin berarti sembilan orang yang sama dua kali.
Membatasi jumlah baris adalah bagian pertama dari fitur ini. Memilih di mana jendela dimulai adalah bagian kedua.
Menggunakan Nilai OFFSET dalam Kueri LIMIT
The OFFSET Nilai ini paling sering digunakan bersamaan dengan kata kunci LIMIT. Nilai ini menentukan baris mana yang menjadi titik awal pengambilan data oleh server, sehingga baris sebelum titik tersebut akan dilewati.
Misalkan kita menginginkan sejumlah anggota terbatas yang dimulai dari tengah tabel. Skrip di bawah ini dimulai dari baris kedua dan membatasi hasilnya menjadi dua catatan.
SELECT * FROM `members` LIMIT 1, 2;
Melaksanakannya di MySQL Workbench Pengujian terhadap myflixdb memberikan hasil sebagai berikut.
| Nomor keanggotaan | nama lengkap | jenis kelamin | tanggal_lahir | tanggal_pendaftaran | alamat fisik | alamat pos_ | nomor kontak | nomor_kartu_kredit | |
|---|---|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jones | Perempuan | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Pria | 12-07-1989 | NULL | Jalan ke-3 34 | NULL | 12345 | rm@tstreet.com | NULL |
Perhatikan bahwa di sini OFFSET = 1, oleh karena itu baris #2 adalah baris pertama yang dikembalikan, dan BATAS = 2, oleh karena itu hanya 2 catatan yang kembali.
Dalam bentuk dua argumen, offset ditulis terlebih dahulu dan jumlah baris kedua, yang mudah terbalik secara tidak sengaja. MySQL juga menerima bentuk eksplisit yang menghilangkan ambiguitas, dan ini adalah bentuk yang lebih disukai dalam kode baru.
SELECT * FROM `members` LIMIT 2 OFFSET 1;
Kedua pernyataan tersebut mengembalikan dua baris yang sama. Dengan memahami offset, pola paginasi yang diandalkan oleh setiap layar daftar akan langsung terlihat darinya.
Cara Melakukan Paginasi Hasil Kueri dengan LIMIT dan OFFSET
Paginasi membagi kumpulan hasil yang besar menjadi halaman-halaman bernomor, dan LIMIT bersama dengan OFFSET adalah mekanisme yang melakukannya. Dua nilai menggerakkan setiap permintaan halaman: ukuran halaman, yaitu berapa banyak catatan yang muncul di satu layar, dan nomor halaman yang diminta oleh pengguna.
Selisih tersebut diperoleh dari nilai-nilai tersebut dengan menggunakan satu rumus tunggal.
-- OFFSET = page_size * (page_number - 1) SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 0; -- page 1
Halaman 2 mempertahankan batas yang sama dan menggeser offset ke depan satu ukuran halaman.
SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 20; -- page 2
Tiga aturan menjaga agar daftar berhalaman tetap akurat dan cepat.
- Selalu urutkan: Kueri berhalaman tanpa ORDER BY dapat menampilkan catatan yang sama di dua halaman berbeda dan menyembunyikan catatan lainnya sepenuhnya, karena server bebas mengubah urutan baris di antara panggilan.
- Urutkan berdasarkan kolom unik: Nilai yang sama pada kolom pengurutan menyebabkan urutan baris yang sama menjadi tidak terdefinisi. Pengurutan berdasarkan kunci utama, atau menambahkannya sebagai penentu urutan jika terjadi kesamaan nilai, akan menghilangkan masalah ini.
- Lihat halaman-halaman yang lebih dalam: OFFSET 100000 gaya MySQL Membaca seratus ribu baris dan membuangnya sebelum mengembalikan dua puluh baris berikutnya. Waktu respons meningkat seiring dengan nomor halaman.
Untuk paginasi yang sangat mendalam, paginasi berbasis keyset sepenuhnya menghindari offset. Alih-alih menghitung baris yang akan dilewati, kueri mengingat kunci terakhir dari halaman sebelumnya dan meminta baris setelahnya.
SELECT membership_number, full_names FROM members WHERE membership_number > 20 -- last id from the previous page ORDER BY membership_number ASC LIMIT 20;
Bentuk ini tetap cepat pada kedalaman berapa pun, karena indeks langsung melompat ke kunci awal daripada menelusuri baris di depannya. Kelemahannya adalah halaman harus ditelusuri secara berurutan, jadi lompatan...ping Mengakses langsung halaman 500 sudah tidak memungkinkan lagi.
BATAS dalam MySQL vs TOP dan FETCH FIRST
LIMIT bukanlah bagian dari setiap dialek SQL, yang menjadi penting begitu sebuah kueri harus berpindah antar mesin basis data. MySQL, PostgreSQL, dan SQLite sama-sama menggunakan kata kunci LIMIT. SQL Server menggunakan TOP, dan Oracle menggunakan klausa FETCH FIRST standar. Tabel di bawah ini membandingkan ketiganya.
| Ayat | Mesin | Example | Melewati baris |
|---|---|---|---|
| BATAS … PENGHAPUSAN | MySQL, PostgreSQL, SQLite | SELECT * FROM members LIMIT 20 OFFSET 40; | Ya, dengan OFFSET |
| TOP | SQL Server | SELECT TOP 20 * FROM members; | Tidak, OFFSET … FETCH diperlukan |
| AMBIL PERTAMA | Oracle, Db2, SQL standar | SELECT * FROM members FETCH FIRST 20 ROWS ONLY; | Ya, dengan OFFSET … ROWS |
Perilakunya sama dalam setiap kasus: batasi jumlah baris dan, secara opsional, lewati sejumlah baris terlebih dahulu. Hanya ejaannya yang berubah. Oleh karena itu, kueri yang harus dijalankan pada lebih dari satu mesin harus mengisolasi klausa pembatasan baris daripada menyebarkannya di seluruh basis kode.
