Query pada chapter SELECT dan Filtering sudah mampu menyaring baris dan kolom, tetapi hasilnya masih tampil dalam urutan penyimpanan tabel. Laporan nyata menuntut urutan yang pasti: manajer ingin melihat produk termahal di posisi teratas, halaman katalog menampilkan sepuluh produk per halaman, dan daftar pelanggan diurutkan berdasarkan kota. Chapter ini membahas klausa ORDER BY untuk pengurutan serta LIMIT dan OFFSET untuk pembatasan hasil, semuanya tetap memakai tabel toko online dari chapter Pengenalan SQL.
Mengurutkan dengan ORDER BY #
Klausa ORDER BY mengurutkan baris hasil berdasarkan satu atau lebih kolom. Arah bawaan adalah menaik (ASC), dan DESC membaliknya menjadi menurun:
SELECT nama, kategori, harga FROM produk ORDER BY hargaOutput yang Dihasilkan:
('Kemeja Batik', 'fashion', 250000)
('Dress Summer', 'fashion', 380000)
('TWS Earbuds', 'elektronik', 750000)
('Sneakers Klasik', 'fashion', 900000)
('Smartphone X1', 'elektronik', 3500000)
('Laptop Pro 14', 'elektronik', 12500000)SELECT nama, kategori, harga FROM produk ORDER BY harga DESCOutput yang Dihasilkan:
('Laptop Pro 14', 'elektronik', 12500000)
('Smartphone X1', 'elektronik', 3500000)
('Sneakers Klasik', 'fashion', 900000)
('TWS Earbuds', 'elektronik', 750000)
('Dress Summer', 'fashion', 380000)
('Kemeja Batik', 'fashion', 250000)ORDER BY Multi Kolom #
Pengurutan satu kolom sering menghasilkan nilai yang sama — enam produk hanya punya dua kategori. Kolom kedua menjadi pemecah urutan (tiebreaker):
SELECT nama, kategori, harga FROM produk
ORDER BY kategori ASC, harga DESCOutput yang Dihasilkan:
('Laptop Pro 14', 'elektronik', 12500000)
('Smartphone X1', 'elektronik', 3500000)
('TWS Earbuds', 'elektronik', 750000)
('Sneakers Klasik', 'fashion', 900000)
('Dress Summer', 'fashion', 380000)
('Kemeja Batik', 'fashion', 250000)Baris diurutkan berdasarkan kategori terlebih dahulu; baris-baris dengan kategori yang sama lalu diurutkan berdasarkan harga menurun. Setiap kolom boleh membawa arah sendiri — pada query di atas, kategori menaik sementara harga menurun di dalam tiap kelompok kategori. Prioritas pengurutan mengikuti urutan penulisan dari kiri ke kanan.
Membatasi Hasil dengan LIMIT dan OFFSET #
Klausa LIMIT memotong jumlah baris hasil — pola umum untuk laporan “sepuluh besar” dan antarmuka pencarian:
SELECT nama, harga FROM produk ORDER BY harga DESC LIMIT 3Output yang Dihasilkan:
('Laptop Pro 14', 12500000)
('Smartphone X1', 3500000)
('Sneakers Klasik', 900000)Klausa OFFSET melewati sejumlah baris sebelum mulai mengembalikan hasil. Kombinasi LIMIT 3 OFFSET 3 mengambil halaman kedua dari daftar yang dipotong tiga baris per halaman:
SELECT nama, harga FROM produk ORDER BY harga ASC LIMIT 3 OFFSET 3Output yang Dihasilkan:
('Sneakers Klasik', 900000)
('Smartphone X1', 3500000)
('Laptop Pro 14', 12500000)LIMIT tanpa ORDER BY menghasilkan “tiga baris apa pun” — hampir selalu merupakan bug pada aplikasi. Selalu pasangkan pembatasan jumlah baris dengan pengurutan yang eksplisit agar halaman pertama dan kedua tidak menampilkan baris yang tumpang tindih.
NULL dalam Urutan #
NULL tidak punya nilai sehingga standar SQL membiarkan tiap database menentukan posisinya. SQLite menempatkan NULL paling awal saat urutan menaik:
SELECT nama, kota FROM pelanggan ORDER BY kotaOutput yang Dihasilkan:
('Andi Wijaya', None)
('Siti Rahayu', 'Bandung')
('Farhan Pratama', 'Bandung')
('Budi Santoso', 'Jakarta')
('Rina Kartika', 'Jakarta')
('Dewi Lestari', 'Surabaya')Dua hal patut dicermati dari hasil di atas. Pertama, Andi Wijaya dengan kota NULL muncul paling awal. Kedua, urutan antar pelanggan Bandung dan antar pelanggan Jakarta tidak ditentukan karena kolom kota bernilai sama — SQLite kebetulan mengembalikan Siti sebelum Farhan, tetapi urutan tersebut bukan jaminan. Tambahkan kolom pemecah urutan agar hasil menjadi deterministik:
SELECT nama, kota FROM pelanggan ORDER BY kota, namaOutput yang Dihasilkan:
('Andi Wijaya', None)
('Farhan Pratama', 'Bandung')
('Siti Rahayu', 'Bandung')
('Budi Santoso', 'Jakarta')
('Rina Kartika', 'Jakarta')
('Dewi Lestari', 'Surabaya')PostgreSQL menerapkan kebijakan berbeda: NULL ditempatkan paling akhir pada urutan menaik — tepat kebalikan dari SQLite. Untuk mengendalikan posisi NULL secara eksplisit, SQL modern menyediakan NULLS FIRST dan NULLS LAST yang didukung SQLite maupun PostgreSQL:
SELECT nama, kota FROM pelanggan ORDER BY kota ASC NULLS LAST, namaOutput yang Dihasilkan:
('Farhan Pratama', 'Bandung')
('Siti Rahayu', 'Bandung')
('Budi Santoso', 'Jakarta')
('Rina Kartika', 'Jakarta')
('Dewi Lestari', 'Surabaya')
('Andi Wijaya', None)Pengurutan dan pembatasan bekerja pada tingkat baris: setiap baris tetap tampil utuh satu per satu. Pertanyaan manajemen berikutnya — berapa total pendapatan, berapa rata-rata harga — membutuhkan peringkasan banyak baris menjadi satu angka, materi chapter Agregasi Data.