ORDER BY Olmadan Satır Sırası Belli Değildir
ORDER BY içermeyen bir SELECT sorgusu, satırları SQLite'ın işine geldiği sırayla döndürür. Küçük tablolarda genellikle ekleme sırasına göre geliyormuş gibi görünür ve bu da insanları yanıltır. Sakın güvenmeyin. Bir indeks devreye girdiği anda, tablo büyüdüğünde ya da sorgu planı değiştiğinde bu sıra hiçbir uyarı vermeden değişebilir.
Satırlarınızın hangi sırada gelmesi gerektiği sizin için önemliyse, bunu açıkça belirtin:
ORDER BY name varsayılan olarak artan sırada sıralar. Sonuç her seferinde Ada, Boris, Chen, Rosa şeklinde, yani alfabetik olarak döner — tablonun diskte nasıl tutulduğunun hiç önemi yok.
ASC ve DESC
ASC artan sıralamayı ifade eder (küçükten büyüğe, A'dan Z'ye, eskiden yeniye). DESC ise tam tersi: azalan sıralama. Varsayılan değer ASC olduğundan, pratikte neredeyse hiç yazılmaz:
Bu sorgu sana en son kayıt olanları başa getirir. ISO 8601 formatında (YYYY-MM-DD) saklanan tarihler metin olarak da doğru sıralanır — zaten SQLite'ın ayrı bir tarih tipi olmaması nedeniyle tarih sütunlarında bu formatın tercih edilmesinin sebeplerinden biri de budur.
SQLite'ta Çoklu Sütuna Göre Sıralama
İlk sıralama sütununda eşit değerler varsa, SQLite ikinci sütuna bakarak bu eşitliği bozar. Sütunları öncelik sırasına göre virgülle ayırarak yazmanız yeterli:
Önce ülkeye göre gruplanır (FR, US'den önce gelir), ardından her ülkenin içinde isme göre sıralanır. İsterseniz her sütuna ayrı bir yön de verebilirsiniz:
Önce ülkeye göre artan, ardından her ülke içinde en yeniden eskiye doğru sıralanır. ASC ve DESC ifadeleri yalnızca yanında durdukları sütun için geçerlidir; bir sonraki sütuna otomatik olarak taşınmazlar.
İfadelere ve takma adlara göre sıralama
ORDER BY yalnızca sütun adlarıyla sınırlı değildir; herhangi bir ifadeyi de kabul eder. Hesaplanmış değerlerle çalışırken bu çok işe yarar:
SELECT listesinde tanımladığınız revenue takma adını ORDER BY içinde rahatlıkla kullanabilirsiniz. İsterseniz ifadeyi tekrar yazıp ORDER BY price * quantity DESC da diyebilirsiniz; sonuç aynı.
Sütun sırasına göre sıralama da mümkün, ama bunu alışkanlık haline getirmemekte fayda var:
SELECT name, price FROM products ORDER BY 2 DESC;
2, SELECT listesindeki ikinci sütun anlamına gelir. Çalışır çalışmasına ama biri ileride sütunların sırasını değiştirirse, sıralamanın anlamı sessiz sedasız değişiverir. Onun yerine sütun adıyla ya da takma adla sıralayın.
NULL değerleri nereye düşer?
NULL, "bilinmiyor" demek; SQLite de bu bilinmeyen değerleri sıralamada bir yere yerleştirmek zorunda. Varsayılan kural şu: ASC sıralamada NULL'lar başa, DESC sıralamada sona gelir.
Ada ve Chen, herhangi bir gerçek tarihten önce en üstte görünüyor. "En yeniden eskiye" sıralamada genelde istediğiniz şey bu değildir. NULLS LAST ile bu davranışı tersine çevirebilirsiniz:
Artık gerçek tarihler en üstte, NULL değerler en altta yer alır. NULLS FIRST ise tam tersini yapar. Her ikisi de standart SQL'in parçasıdır ve SQLite 3.30 ve sonraki sürümlerde çalışır.
COLLATE NOCASE ile Büyük Küçük Harf Duyarsız Sıralama
SQLite'ın varsayılan metin karşılaştırması ikilik (binary) tabanlıdır — yani Unicode kod noktalarına göre sıralama yapar. Bu da büyük harflerin küçük harflerden önce geldiği anlamına gelir; örneğin 'Zoe', 'apple' kelimesinden önce sıralanır:
Çıktı Zoe, Boris, apple, ada (binary/code-point order) şeklinde geliyor — yani önce büyük harfle başlayanlar, sonra küçük harfliler. Büyük küçük harf duyarsız sıralama yapmak için sorguya NOCASE collation'ını ekleyin:
Sonuç: ada, apple, Boris, Zoe. NOCASE yalnızca ASCII'deki A–Z ve a–z harflerini eşdeğer kabul eder; aksanları veya ASCII dışı karakterleri normalize etmez. Gerçek anlamda uluslararasılaştırılmış bir sıralama istiyorsanız uygulama tarafında özel bir collation tanımlamanız gerekir; ancak günlük İngilizce metinler için NOCASE gayet iş görür.
Rastgele Sıralama
Bazen satırları rastgele sırada görmek istersiniz — günün öne çıkan öğesini seçmek, test için örnek satır almak gibi durumlarda. SQLite'ın random() fonksiyonu rastgele bir tamsayı döndürür; siz de buna göre sıralarsınız:
Her satıra yeni bir rastgele değer atanır ve sıralama bunları karıştırır. Küçük tablolar için sorun yok. Ama büyük tablolarda ORDER BY random() yavaş çalışır — her satır için rastgele bir değer hesaplaması ve tüm sonucu sıralaması gerekir. Devasa bir tablodan tek bir rastgele satır çekmek istiyorsanız, daha akıllıca yöntemler (örneğin rastgele bir rowid seçmek) çok daha hızlıdır.
Sık Yapılan Hatalar
İnsanların kafasını karıştıran birkaç nokta:
ORDER BYyazmayıp belirli bir sıra varsaymak. Bu olmadan sıralama tanımsızdır. Tutarlı görünse bile öyle değildir.- Metin olarak saklanan sayıları sıralamak.
'10'sözlük sıralamasında'2''den önce gelir. Bir sütun sayısal olarak sıralanacaksa, sayısal bir affinity ile saklayın (ya da dönüştürün:ORDER BY CAST(value AS INTEGER)). - Sütunlarda ASC ve DESC'i karıştırmak. Her sütunun kendi yönü vardır.
ORDER BY a, b DESCifadesia'yı artan,b'yi azalan olarak sıralar — ikisini birden azalan değil. - Sadece ilk birkaç satırı almak için kocaman bir sonuç kümesini sıralamak.
ORDER BYile birlikteLIMITkullanın ve sıralanan sütuna bir indeks ekleyin — bir sonraki konumuz tam da bu.
Sırada: LIMIT ve OFFSET
Sıralama, SQLite'a satırları nasıl dizeceğini söyler; LIMIT ve OFFSET ise kaç tane döndüreceğini ve nereden başlayacağını belirtir. İkisi bir araya geldiğinde sayfalama ve "ilk N" sorgularının bel kemiğini oluşturur — hemen ardından geliyor.
Sıkça Sorulan Sorular
SQLite'ta sonuçları nasıl sıralarım?
SELECT sorgunuzun sonuna sıralayacağınız sütunu belirten bir ORDER BY ekleyin. Örneğin SELECT * FROM users ORDER BY name; artan sırada sıralar. Azalan sıralama için DESC ekleyin: ORDER BY name DESC. ORDER BY kullanmazsanız satırların hangi sırada geleceği garanti edilmez — tutarlı görünse bile asla bu sıraya güvenmeyin.
SQLite'ta birden fazla sütuna göre nasıl sıralama yaparım?
Sütunları virgülle ayırarak yazmanız yeterli: ORDER BY country, name. SQLite önce ilk sütuna göre sıralar, eşitlik durumunda ikinci sütunu kullanır. Her sütunun yönü ayrı ayrı belirlenebilir: ORDER BY country ASC, signup_date DESC.
SQLite'ta büyük/küçük harfe duyarsız sıralama nasıl yapılır?
ORDER BY içinde COLLATE NOCASE kullanın: ORDER BY name COLLATE NOCASE. SQLite varsayılan olarak metni binary collation ile sıraladığı için Zoe, apple'dan önce gelir. NOCASE ise büyük ve küçük harfi sıralama açısından eşit kabul eder.
Sıralanmış bir SQLite sonucunda NULL değerler nerede görünür?
Varsayılan olarak NULL'lar artan sıralamada en başta, azalan sıralamada en sonda yer alır. Bu davranışı NULLS FIRST veya NULLS LAST ile değiştirebilirsiniz: ORDER BY signup_date DESC NULLS LAST ifadesi gerçek tarihleri üstte tutar, eksik olanları en alta atar.