ORDER BY, LIMIT & OFFSET: Mengurutkan dan Membagi Halaman

Mengurutkan hasil naik/turun, urutan bertingkat, NULLS FIRST/LAST, membatasi jumlah baris dengan LIMIT, dan membuat paginasi dengan OFFSET.

Part 9 dari 25 ± 30 menit Gratis

Analogi: ORDER BY itu seperti menata buku di rak dari yang termurah ke termahal. LIMIT dan OFFSET seperti membagi rak menjadi halaman: "tampilkan 10 buku per halaman, lompati 20 buku pertama untuk melihat halaman 3".

ORDER BY: mengurutkan hasil

Tanpa ORDER BY, urutan baris tidak dijamin (database bebas memberikannya dalam urutan apa pun). Kalau urutan penting, selalu tulis ORDER BY.

SELECT judul, harga FROM buku ORDER BY harga;          -- naik (ASC), kecil ke besar
SELECT judul, harga FROM buku ORDER BY harga DESC;     -- turun (DESC), besar ke kecil

Urutan bertingkat

Kalau ada nilai yang sama, tentukan pengurut kedua, ketiga, dst. dipisah koma:

SELECT judul, kategori_id, harga
FROM buku
ORDER BY kategori_id ASC, harga DESC;   -- per kategori, di dalamnya yang termahal dulu

Mengurutkan teks dan menangani NULL

Urutan teks mengikuti aturan alfabet (ORDER BY judul). Untuk NULL, PostgreSQL menganggapnya "lebih besar dari semua nilai": pada urutan naik NULL berada di akhir, pada urutan turun di awal. Atur sendiri dengan NULLS FIRST atau NULLS LAST:

SELECT judul, kategori_id FROM buku ORDER BY kategori_id NULLS FIRST;

LIMIT: membatasi jumlah baris

SELECT judul, harga FROM buku ORDER BY harga DESC LIMIT 3;   -- 3 buku termahal

LIMIT hampir selalu dipasangkan dengan ORDER BY. "3 termahal" tidak bermakna kalau tidak ada urutan.

OFFSET: melompati baris (paginasi)

Untuk membuat halaman 1, 2, 3 di aplikasi:

-- 4 buku per halaman
SELECT judul FROM buku ORDER BY judul LIMIT 4 OFFSET 0;   -- halaman 1
SELECT judul FROM buku ORDER BY judul LIMIT 4 OFFSET 4;   -- halaman 2
SELECT judul FROM buku ORDER BY judul LIMIT 4 OFFSET 8;   -- halaman 3

Rumusnya: OFFSET = (nomor_halaman - 1) * ukuran_halaman.

PostgreSQL juga mengenal sintaks standar SQL: FETCH FIRST 3 ROWS ONLY, setara dengan LIMIT 3.

OFFSET yang sangat besar (misalnya 1.000.000) lambat karena database tetap harus melewati baris-baris itu. Untuk data raksasa dipakai teknik keyset pagination, tapi untuk belajar dan aplikasi umum OFFSET sudah cukup.

Kasus nyata: halaman katalog dan "5 buku terlaris"

Katalog online menampilkan 10 buku per halaman. Untuk halaman ke-3:

SELECT judul, harga FROM buku
ORDER BY harga ASC, judul ASC
LIMIT 10 OFFSET 20;   -- (halaman - 1) * 10

Dan untuk widget "5 buku termahal" di beranda: ORDER BY harga DESC LIMIT 5.

Kesalahan yang sering terjadi

  • Memakai LIMIT tanpa ORDER BY. Urutan baris tidak dijamin, sehingga halaman bisa berubah-ubah.
  • Pagination dengan OFFSET sangat besar pada tabel raksasa. Makin dalam halamannya, makin lambat; pada skala besar gunakan pagination berbasis kunci.
  • Mengurutkan teks yang berisi angka ('10' < '9'). Simpan angka di kolom bertipe angka.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X