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.
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) * 10Dan untuk widget "5 buku termahal" di beranda: ORDER BY harga DESC LIMIT 5.
Kesalahan yang sering terjadi
- Memakai
LIMITtanpaORDER BY. Urutan baris tidak dijamin, sehingga halaman bisa berubah-ubah. - Pagination dengan
OFFSETsangat 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.