ORDER BY menyusun baris hasil SELECT menurut satu kolom atau lebih, dari kecil ke besar atau dari besar ke kecil. Bayangin wali kelas menyusun daftar ranking: nilai tertinggi di atas, dan kalau ada dua siswa dengan nilai sama, yang namanya duluan di abjad ditaruh lebih dulu. Itu persis yang dikerjakan ORDER BY: urutan pertama, lalu urutan kedua untuk yang seri.
🧪 Tebakan cepat: Dewi dan Andi sama-sama dapat 90. Dengan
ORDER BY grade DESCsaja, siapa yang muncul duluan? Tebak dulu, jawabannya ada di bagian "Dua kunci: kalau nilainya seri".
Tanpa ORDER BY, urutan gak dijamin
Ini tabel students yang dipakai di Lab dan latihan:
SELECT * FROM students;
| id | name | grade | city |
|---|---|---|---|
| 1 | Dewi | 90 | Jakarta |
| 2 | Rizky | 85 | Bandung |
| 3 | Maya | 92 | Surabaya |
| 4 | Andi | 90 | Jakarta |
| 5 | Budi | 88 | Bandung |
SQLite mengembalikan baris dalam urutan dia menyimpannya, jadi kelihatannya urut id. Tapi itu kebetulan, bukan janji. Database boleh mengembalikan baris dalam urutan apa pun, dan urutannya bisa berubah setelah data diubah atau tabelnya makin besar. Kalau urutan penting, tulis ORDER BY.
ASC dan DESC
SELECT * FROM students
ORDER BY grade DESC;
| id | name | grade | city |
|---|---|---|---|
| 3 | Maya | 92 | Surabaya |
| 1 | Dewi | 90 | Jakarta |
| 4 | Andi | 90 | Jakarta |
| 5 | Budi | 88 | Bandung |
| 2 | Rizky | 85 | Bandung |
ORDER BY gradememilih kolom yang dipakai untuk mengurutkan.DESC(descending, menurun) artinya dari besar ke kecil. Untuk teks, dari Z ke A.ASC(ascending, menaik) artinya dari kecil ke besar, atau A ke Z. Ini bawaannya:ORDER BY namesama denganORDER BY name ASC.ORDER BYditulis setelahFROM, dan setelahWHEREkalau ada:SELECT * FROM students WHERE city = 'Jakarta' ORDER BY name;.
Dua kunci: kalau nilainya seri
Di hasil tadi Dewi muncul sebelum Andi. Itu cuma karena Dewi disimpan lebih dulu. Query-nya gak bilang apa-apa soal nilai yang seri, jadi database lain (atau SQLite yang sama setelah tabelnya berubah) boleh saja menaruh Andi duluan. Itu jawaban tebakannya: dengan grade DESC saja, urutan Dewi dan Andi gak ditentukan.
Tambahkan kunci kedua, dipisah koma:
SELECT * FROM students
ORDER BY grade DESC, name ASC;
| id | name | grade | city |
|---|---|---|---|
| 3 | Maya | 92 | Surabaya |
| 4 | Andi | 90 | Jakarta |
| 1 | Dewi | 90 | Jakarta |
| 5 | Budi | 88 | Bandung |
| 2 | Rizky | 85 | Bandung |
grade DESCdiurutkan duluan. Maya (92) tetap paling atas.name ASCbaru dipakai untuk baris yanggrade-nya sama persis. Andi dan Dewi sama-sama 90, jadi Andi (A) naik sebelum Dewi (D).- Tiap kunci punya arahnya sendiri.
grade DESC, name ASCbeda dengangrade DESC, name DESC. - Semua kunci ada di satu
ORDER BY, dipisah koma.
💡 Beda SQLite, MySQL, dan PostgreSQL
- NULL (kosong, belum ada nilai). SQLite dan MySQL menganggap NULL lebih kecil dari semua nilai: muncul paling atas di
ASC, paling bawah diDESC. PostgreSQL kebalikannya. Mau pasti di mana pun? SQLite (3.30 ke atas) dan PostgreSQL pahamORDER BY grade DESC NULLS LAST; MySQL belum punya. - Huruf besar-kecil. SQLite membandingkan teks per kode huruf, dan semua huruf besar datang sebelum huruf kecil. Siswa bernama
andi(huruf kecil) ditaruh setelahRizky. MySQL dengan pengaturan bawaannya mengabaikan besar-kecil huruf. Di SQLite tulisORDER BY name COLLATE NOCASEkalau mau urutan kamus.
⚠️ Jebakan yang sering ketemu
- Menulis ORDER BY dua kali.
ORDER BY grade DESC ORDER BY nameditolak SQLite:near "ORDER": syntax error. Satu query cuma punya satuORDER BY, kunci berikutnya dipisah koma. - Mengira DESC berlaku untuk semua kolom.
ORDER BY grade, name DESCartinyagrade ASC, name DESC. Arah cuma menempel ke kolom tepat sebelumnya. - Salah nama kolom.
ORDER BY nilaidijawabno such column: nilai. Kolomnya bernamagrade. - Gak menulis kunci kedua. Kalau ada nilai seri dan urutannya penting (ranking, halaman berikutnya), tambahkan kunci kedua.
TL;DR: ORDER BY kolom mengurutkan hasil query. ASC dari kecil ke besar (A ke Z) dan jadi bawaan kalau gak ditulis, DESC dari besar ke kecil (Z ke A). Tanpa ORDER BY urutan baris gak dijamin. Untuk nilai seri, tambahkan kunci kedua di ORDER BY yang sama, dipisah koma, dengan arahnya sendiri: ORDER BY grade DESC, name ASC. Satu query, satu ORDER BY.