ORDER BY SQL: Urutkan Hasil Query Naik atau Turun
TL;DR
ORDER BY adalah klausa SQL yang mengurutkan hasil query berdasarkan satu kolom atau lebih. Tulis ORDER BY nama_kolom ASC untuk urutan naik, atau DESC untuk urutan turun — kalau nggak disebut, database pakai ASC. Tanpa ORDER BY, urutan baris hasil query nggak dijamin konsisten, bahkan untuk query yang sama persis.
ORDER BY adalah klausa SQL yang ngurutin hasil query. Naik pakai ASC, turun pakai DESC. Satu baris tambahan, dan tabel hasilnya langsung kebaca.
Ada satu hal yang bikin kaget orang yang baru mulai: tanpa ORDER BY, urutan baris yang keluar nggak dijamin. Query yang sama, dijalanin dua kali, bisa ngasih urutan berbeda.
Di bawah ada sintaksnya, sortir multi kolom, penanganan NULL yang beda-beda antar database, dan trik urutan custom pakai CASE.
Apa itu ORDER BY di SQL?
ORDER BY adalah klausa yang menentukan urutan baris di hasil query, berdasarkan satu kolom atau lebih. Dia jalan hampir paling akhir — setelah semua baris disaring dan dihitung.
SELECT kolom
FROM tabel
ORDER BY kolom_pengurut [ASC | DESC];
ASC artinya naik: 1 ke 100, A ke Z, tanggal lama ke tanggal baru. DESC kebalikannya.
Kalau kamu nggak nulis apa-apa, database pakai ASC. Jadi ORDER BY total dan ORDER BY total ASC itu sama persis.
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),
rating INT
);
INSERT INTO transaksi (id, tanggal, kota, kategori, produk, total, rating) VALUES
(1, '2026-01-03', 'Surabaya', 'Minuman', 'Kopi Sachet Gula Aren', 25000.00, 5),
(2, '2026-01-03', 'Bandung', 'Snack', 'Keripik Singkong', 60000.00, NULL),
(3, '2026-01-04', 'Surabaya', 'Minuman', 'Teh Kotak', 96000.00, 4),
(4, '2026-01-05', 'Jakarta', 'Sembako', 'Beras Premium 5kg', 225000.00, 5),
(5, '2026-01-06', 'Bandung', 'Minuman', 'Kopi Susu Botol', 108000.00, 3),
(6, '2026-01-07', 'Jakarta', 'Snack', 'Biskuit Kaleng', 110000.00, NULL),
(7, '2026-01-08', 'Surabaya', 'Sembako', 'Minyak Goreng 2L', 228000.00, 4),
(8, '2026-01-09', 'Bandung', 'Minuman', 'Kopi Sachet Gula Aren', 50000.00, 5);
Gimana cara urutkan dari besar ke kecil?
SELECT produk, total FROM transaksi
ORDER BY total DESC;
Hasilnya dimulai dari Minyak Goreng 2L (228.000), lalu Beras Premium 5kg (225.000), turun sampai Kopi Sachet Gula Aren (25.000).
Ini bentuk yang paling sering dipakai di laporan penjualan. Produk terlaris di atas, yang seret di bawah.
Gimana cara urutkan berdasarkan dua kolom?
Sebut kolomnya dipisah koma. Urutan penulisan = urutan prioritas.
SELECT kota, produk, total FROM transaksi
ORDER BY kota ASC, total DESC;
Database ngurutin kota dulu (Bandung, Jakarta, Surabaya). Baru di dalam tiap kota, transaksinya diurutin dari total terbesar.
Kolom kedua cuma jadi penentu waktu kolom pertama nilainya kembar. Kalau semua kotanya beda, kolom kedua nggak ada efeknya sama sekali.
Tiap kolom boleh punya arah sendiri. ORDER BY kota ASC, total DESC — satu naik, satu turun. Itu sah.
NULL ditaruh di mana waktu diurutkan?
Ini bagian yang bikin hasil kamu beda-beda antar database.
| Database | ASC | DESC |
|---|---|---|
| PostgreSQL, Oracle | NULL di akhir | NULL di awal |
| MySQL, SQL Server | NULL di awal | NULL di akhir |
Di PostgreSQL dan Oracle, kamu bisa atur sendiri:
SELECT produk, rating FROM transaksi
ORDER BY rating DESC NULLS LAST;
MySQL nggak punya NULLS LAST. Cara yang jalan di semua database: bikin kolom bantu pakai CASE.
SELECT produk, rating FROM transaksi
ORDER BY (CASE WHEN rating IS NULL THEN 1 ELSE 0 END), rating DESC;
Baris dengan rating NULL dikasih nilai 1, sisanya 0. Yang 0 naik duluan, jadi NULL selalu nyangkut di bawah. Perilaku NULL lengkapnya dibahas di artikel NULL di SQL.
Bisa nggak ORDER BY pakai alias?
Bisa. Ini salah satu hal yang membedakan ORDER BY dari WHERE.
SELECT produk, total * 0.11 AS ppn
FROM transaksi
ORDER BY ppn DESC;
Jalan mulus. Alasannya: ORDER BY dieksekusi setelah SELECT, jadi alias-nya udah ada. WHERE jalan sebelum SELECT, makanya dia nggak bisa lihat alias.
ORDER BY + LIMIT: bikin Top N
Ini pasangan yang paling sering dipakai di laporan.
SELECT produk, total FROM transaksi
ORDER BY total DESC
LIMIT 3;
Tiga produk termahal, urut dari yang paling gede. Tanpa ORDER BY, LIMIT 3 bakal ngasih 3 baris acak — dan itu jelas bukan yang kamu mau. Detail LIMIT ada di artikel LIMIT dan OFFSET.
Trik: urutan custom pakai CASE
Kadang urutan yang kamu mau bukan alfabet dan bukan angka. Misalnya kategori harus tampil dengan urutan Sembako, Minuman, Snack — sesuai prioritas bisnis, bukan abjad.
SELECT produk, kategori FROM transaksi
ORDER BY CASE kategori
WHEN 'Sembako' THEN 1
WHEN 'Minuman' THEN 2
WHEN 'Snack' THEN 3
ELSE 99
END;
Kamu kasih nomor urut sendiri ke tiap nilai, lalu urutin pakai nomor itu. Kategori yang nggak kesebut jatuh ke 99 dan nyangkut di bawah.
Kesalahan umum di ORDER BY
Angka disimpan sebagai teks
Kalau kolom nomor disimpan sebagai VARCHAR, urutannya jadi 1, 10, 100, 2, 20 — karena diurutin per karakter, bukan per nilai. Perbaikannya: ubah tipe kolomnya, atau paksa konversi waktu ngurutin dengan ORDER BY CAST(kode AS INT).
Ngandelin urutan tanpa ORDER BY
"Kemarin urutannya bener kok." Iya, kebetulan. Database bebas ngasih baris dalam urutan apa pun yang paling cepat buat dia, dan urutan itu bisa berubah setelah data nambah, index dibikin, atau query jalan paralel. Kalau urutan penting, tulis ORDER BY.
ORDER BY nomor kolom
ORDER BY 2 artinya "urutkan pakai kolom kedua di SELECT". Jalan, tapi rapuh — begitu ada yang nambah kolom di SELECT, urutannya diam-diam berubah. Sebut nama kolomnya.
ORDER BY di kolom besar bikin lambat
Ngurutin 10 juta baris itu kerja berat. Kalau query-nya lambat, cek dulu apakah kolom pengurutnya punya index. Bahasan lengkapnya ada di artikel index SQL.
Referensi klausanya ada di halaman fungsi ORDER BY dan glosarium sorting. Sintaks resminya di dokumentasi PostgreSQL.
FAQ ORDER BY SQL
Apa default ORDER BY, ASC atau DESC?
Default-nya ASC alias urutan naik — dari kecil ke besar, dari A ke Z, dari tanggal lama ke tanggal baru. Jadi ORDER BY total dan ORDER BY total ASC hasilnya sama persis. Buat urutan turun, kamu harus nulis DESC secara eksplisit. Nggak ada database yang default-nya DESC.
Gimana cara urutkan berdasarkan dua kolom?
Sebut kolomnya dipisah koma, dan urutan penulisannya menentukan prioritas. ORDER BY kota ASC, total DESC ngurutin kota dulu dari A ke Z, lalu di dalam tiap kota, transaksi diurutkan dari total terbesar. Kolom kedua cuma jadi penentu waktu kolom pertama nilainya kembar.
NULL ditaruh di mana waktu ORDER BY?
Beda-beda tergantung database. PostgreSQL naruh NULL di akhir waktu ASC dan di awal waktu DESC. MySQL kebalikannya. PostgreSQL dan Oracle punya NULLS FIRST dan NULLS LAST. Cara yang jalan di semua database: bikin kolom bantu pakai CASE WHEN, lalu urutkan pakai itu dulu.
Kenapa hasil query saya urutannya berubah-ubah?
Karena kamu nggak pakai ORDER BY. Tanpa ORDER BY, database bebas ngasih baris dalam urutan apa pun yang paling cepat buat dia — dan urutan itu bisa beda antar eksekusi, apalagi setelah data berubah. Kalau urutan penting buat kamu, tulis ORDER BY. Selalu.
Bisa nggak ORDER BY pakai alias kolom?
Bisa. ORDER BY dieksekusi setelah SELECT, jadi alias yang kamu bikin di SELECT udah tersedia. Ini bedanya sama WHERE, yang jalan sebelum SELECT dan karena itu nggak bisa lihat alias. Jadi ORDER BY ppn jalan, sedangkan WHERE ppn > 10000 bakal error.
Rangkuman
ORDER BY default-nya naik. Tulis DESC kalau mau turun.
Kolom pertama menentukan urutan utama, kolom berikutnya cuma jadi pemecah seri. Dan posisi NULL beda antar database — kalau penting, atur sendiri pakai CASE.
Copy tabel transaksi di atas, terus jalanin query yang sama dua kali: sekali dengan ORDER BY, sekali tanpa. Lihat sendiri bedanya.
Lanjut ke LIMIT dan OFFSET buat ngambil sebagian hasil yang udah kamu urutin.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
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.
Latihan Soal SQL Menengah: Window Function & CTE
8 soal SQL level menengah pakai window function dan CTE, lengkap dengan jawaban, penjelasan, dan jebakan yang sering bikin orang salah.
50 Latihan Soal SQL Pemula + Kunci Jawaban
50 latihan soal SQL dari SELECT sampai window function, pakai dataset toko_berkah. Kunci jawabannya ada semua, tapi coba dulu sendiri sebelum ngintip.