Tanpa ORDER BY, Urutan Baris Tidak Pasti
SELECT tanpa ORDER BY mengembalikan baris dalam urutan apa pun yang menurut SQLite praktis. Di tabel kecil, urutannya sering terlihat seperti urutan saat data dimasukkan, sehingga orang jadi terlena dan memercayainya. Jangan. Begitu sebuah index dipakai, tabelnya membesar, atau rencana query berubah, urutan itu bisa bergeser tanpa peringatan.
Jika urutan baris penting bagimu, nyatakan secara eksplisit:
ORDER BY name mengurutkan secara naik secara default. Hasilnya selalu Ada, Boris, Chen, Rosa, urut abjad, terlepas dari bagaimana tabel itu disimpan di disk.
ASC dan DESC
ASC berarti naik (dari terkecil ke terbesar, A sampai Z, terlama ke terbaru). DESC berarti turun, kebalikannya. ASC adalah default, jadi hampir selalu tidak ditulis:
Query itu memberimu pendaftar terbaru lebih dulu. Tanggal yang disimpan sebagai string ISO 8601 (YYYY-MM-DD) terurut dengan benar sebagai teks. Itulah salah satu alasan format ini lebih disukai untuk kolom tanggal di SQLite, yang tidak punya tipe khusus untuk tanggal.
Mengurutkan Berdasarkan Beberapa Kolom
Jika kolom pengurutan pertama punya nilai yang sama, SQLite memakai kolom kedua untuk menentukan urutannya. Tuliskan kolom-kolomnya dipisahkan koma, sesuai prioritas:
Baris dikelompokkan berdasarkan negara lebih dulu (FR sebelum US), lalu di dalam setiap negara diurutkan berdasarkan nama. Setiap kolom bisa punya arahnya sendiri:
Negara diurutkan naik, lalu yang terbaru lebih dulu di dalam setiap negara. ASC dan DESC berlaku untuk kolom yang ada tepat di sebelahnya, dan tidak terbawa ke kolom lain.
Mengurutkan Berdasarkan Ekspresi dan Alias
ORDER BY menerima ekspresi apa pun, bukan hanya nama kolom. Ini berguna untuk nilai hasil perhitungan:
Alias revenue dari daftar SELECT boleh dipakai di ORDER BY. Kamu juga bisa menulis ulang ekspresinya, ORDER BY price * quantity DESC, dan hasilnya sama.
Kamu juga bisa mengurutkan berdasarkan posisi kolom, meskipun kebiasaan ini sebaiknya dihindari:
SELECT name, price FROM products ORDER BY 2 DESC;
2 berarti kolom kedua di daftar select. Ini berfungsi, tapi jika nanti ada yang mengubah urutan kolomnya, arti pengurutannya diam-diam ikut berubah. Urutkan berdasarkan nama atau alias saja.
Di Mana NULL Diletakkan
NULL berarti "tidak diketahui", dan SQLite harus memutuskan di mana nilai yang tidak diketahui ditaruh dalam pengurutan. Aturan default-nya: NULL muncul pertama pada ASC, terakhir pada DESC.
Ada dan Chen muncul di atas, sebelum tanggal yang sebenarnya. Itu jarang yang kamu inginkan untuk "terbaru lebih dulu." Ubah dengan NULLS LAST:
Sekarang tanggal yang sebenarnya muncul lebih dulu, dan NULL di bawah. NULLS FIRST melakukan kebalikannya. Keduanya bagian dari SQL standar dan berfungsi di SQLite 3.30 ke atas.
Pengurutan Tanpa Membedakan Huruf Besar Kecil dengan COLLATE NOCASE
Perbandingan teks default di SQLite bersifat biner: mengurutkan berdasarkan code point Unicode. Artinya huruf besar terurut sebelum huruf kecil, sehingga 'Zoe' muncul sebelum 'apple':
Hasilnya Boris, Zoe, ada, apple: huruf besar dulu, lalu huruf kecil. Untuk mengurutkan tanpa membedakan huruf besar kecil, tambahkan collation NOCASE:
Sekarang kamu mendapat ada, apple, Boris, Zoe. NOCASE hanya menganggap huruf ASCII A sampai Z dan a sampai z setara; collation ini tidak menyeragamkan aksen atau huruf non-ASCII. Untuk pengurutan internasional yang sesungguhnya, kamu butuh collation di level aplikasi, tapi NOCASE sudah cukup untuk kasus umum berbahasa Inggris.
Urutan Acak
Sesekali kamu ingin baris dalam urutan acak, misalnya memilih item unggulan harian atau mengambil sampel baris untuk pengujian. Fungsi random() di SQLite mengembalikan integer acak; urutkan berdasarkan nilai itu:
Setiap baris mendapat nilai acak baru, dan pengurutannya mengacak baris-baris itu. Tidak masalah untuk tabel kecil. Di tabel besar, ORDER BY random() lambat, karena harus menghitung nilai acak untuk setiap baris lalu mengurutkan seluruh hasilnya. Untuk mengambil satu baris sampel dari tabel yang sangat besar, cara yang lebih canggih (misalnya memilih rowid secara acak) lebih cepat.
Kesalahan yang Sering Terjadi
Beberapa hal yang sering menjebak:
- Lupa
ORDER BYlalu menganggap urutannya pasti. Tanpa klausa itu, urutannya tidak pasti. Meskipun terlihat stabil, sebenarnya tidak. - Mengurutkan angka yang disimpan sebagai teks.
'10'terurut sebelum'2'secara leksikografis. Jika sebuah kolom seharusnya diurutkan sebagai angka, simpan dengan affinity numerik (atau cast:ORDER BY CAST(value AS INTEGER)). - Mencampur ASC dan DESC di beberapa kolom. Setiap kolom punya arahnya sendiri.
ORDER BY a, b DESCmengurutkananaik danbturun, bukan keduanya turun. - Mengurutkan hasil yang sangat besar hanya untuk mengambil beberapa baris teratas. Pasangkan
ORDER BYdenganLIMITdan beri index pada kolom pengurutannya. Itulah topik halaman berikutnya.
Selanjutnya: LIMIT dan OFFSET
Pengurutan memberi tahu SQLite bagaimana menyusun baris; LIMIT dan OFFSET memberi tahu berapa banyak yang dikembalikan dan dari mana mulainya. Bersama-sama, keduanya adalah inti dari pagination dan query "N teratas". Dibahas berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara mengurutkan hasil di SQLite?
Tambahkan klausa ORDER BY di akhir SELECT, lalu sebutkan kolom yang dipakai untuk mengurutkan. SELECT * FROM users ORDER BY name; mengurutkan secara naik. Tambahkan DESC untuk urutan turun: ORDER BY name DESC. Tanpa ORDER BY, urutan baris tidak dijamin. Meskipun kelihatannya konsisten, jangan pernah mengandalkannya.
Bagaimana cara mengurutkan berdasarkan beberapa kolom di SQLite?
Tuliskan kolom-kolomnya dipisahkan koma: ORDER BY country, name. SQLite mengurutkan berdasarkan kolom pertama, lalu memakai kolom kedua untuk baris yang nilainya sama. Setiap kolom bisa punya arahnya sendiri: ORDER BY country ASC, signup_date DESC.
Bagaimana cara mengurutkan tanpa membedakan huruf besar kecil di SQLite?
Pakai COLLATE NOCASE di ORDER BY: ORDER BY name COLLATE NOCASE. Secara default, SQLite mengurutkan teks dengan collation biner, sehingga Zoe muncul sebelum apple. NOCASE menganggap huruf besar dan kecil sama saat mengurutkan.
Di mana posisi NULL dalam hasil SQLite yang diurutkan?
Secara default, NULL muncul pertama pada urutan naik dan terakhir pada urutan turun. Kamu bisa mengubahnya dengan NULLS FIRST atau NULLS LAST: ORDER BY signup_date DESC NULLS LAST menaruh tanggal yang sebenarnya di atas dan mendorong yang kosong ke bawah.