ORDER BY ve LIMIT ile Sonuçları Düzenleme
Bir önceki derste WHERE ile satırları süzmeyi öğrenmiştik. Bu derste sonuçları belirli bir düzene sokmayı ve gerekirse yalnızca ilk birkaç satırı görmeyi öğreneceğiz. Bir sonraki derste ise GROUP BY ile satırları gruplayıp toplam, ortalama gibi özet değerler çıkarmaya geçeceğiz; bu yüzden önce sıralamayı iyi kavramak önemli.
Bu derste ne yapacağız?
Bir sorgu sonucunu belirli bir sütuna göre küçükten büyüğe veya büyükten küçüğe sıralamayı, birden fazla sütuna göre sıralamayı ve sonuç listesinden yalnızca istediğimiz sayıda satırı almayı öğreneceğiz. Bunun için ORDER BY ve LIMIT anahtar kelimelerini kullanacağız.
Ön koşul: SELECT ile sütun seçmeyi ve WHERE ile satır süzmeyi bilmek gerekiyor. Elimizde önceki derslerde kullandığımız gibi ürün, öğrenci veya çalışan bilgisi içeren bir tablo olduğunu düşüneceğiz. Bu ders için herhangi bir SQL çalıştırma aracı (örneğin ücretsiz bir veritabanı yönetim programı veya tarayıcı tabanlı bir SQL alıştırma sitesi) açık olmalı. Arayüz görünümü kullandığınız programın sürümüne göre değişebilir; burada anlatılan adımlar genel SQL mantığına dayanır.
Kavram
Bir sorgu çalıştırdığınızda veritabanı size satırları herhangi bir sırada, genellikle tablodaki kayıt sırasına göre verir. Bu sıra çoğu zaman işinize yaramaz; siz belki en yüksek notu alan öğrenciyi, belki en ucuz ürünü görmek istersiniz.
Bunu bir kitapçıdaki kitap rafına benzetebiliriz. Raftaki kitaplar rastgele veya geliş sırasına göre dizilmiş olabilir. Siz kitapları fiyata göre sıralatabilirsiniz ya da yazar adına göre alfabetik dizilmesini isteyebilirsiniz. ORDER BY tam olarak bunu yapar: sonuçları istediğiniz sütuna göre dizer.
LIMIT ise "bana sadece ilk 5 kitabı göster" demek gibidir. Yüzlerce, binlerce satır olan bir tabloda hepsini görmek yerine, sıralamanın en üstündeki belirli sayıda satırı almanızı sağlar. Bu iki özelliği birlikte kullanmak, "en çok satan 3 ürün" veya "en düşük notu alan 5 öğrenci" gibi soruları yanıtlamanın en pratik yoludur.
Adım adım uygulama
Örneklerde urunler adında bir tablomuz olduğunu ve bu tabloda ad, fiyat ve stok adlı sütunlar bulunduğunu varsayalım.
- SQL çalıştırma aracınızı açın ve urunler tablosunun bulunduğu veritabanına bağlı olduğunuzdan emin olun. Genellikle sol taraftaki tablo listesinde urunler adını görmelisiniz.
- Sorgu yazma alanına (çoğu programda New Query veya SQL sekmesi altında bulunur) aşağıdaki sorguyu yazın:
Bu sorguda birinci satır hangi sütunları göreceğimizi (ad ve fiyat), ikinci satır hangi tablodan veri çekeceğimizi, üçüncü satır ise sonuçların fiyat sütununa göre küçükten büyüğe sıralanmasını belirtir.SELECT ad, fiyat FROM urunler ORDER BY fiyat; - Run veya Execute düğmesine (bazı programlarda kırmızı üçgen ya da oynatma simgesi olarak görünür) tıklayın. Sonuç tablosunda ürünlerin artık en ucuzdan en pahalıya doğru dizildiğini göreceksiniz.
- Şimdi sıralamayı ters çevirelim. Aynı sorguyu şöyle güncelleyin:
Buradaki DESC kelimesi "büyükten küçüğe" (descending) anlamına gelir. Eğer bu kelimeyi yazmazsanız, SQL varsayılan olarak küçükten büyüğe (ASC, ascending) sıralar; yani ilk sorgumuzda ASC yazmasak da otomatik olarak uygulanmıştı.SELECT ad, fiyat FROM urunler ORDER BY fiyat DESC; - Sorguyu tekrar çalıştırın. Bu kez en pahalı ürün listenin en üstünde görünecektir.
- Şimdi sadece en pahalı 3 ürünü görmek istediğimizi düşünelim. Sorguyu şöyle değiştirin:
LIMIT 3 ifadesi, sıralama tamamlandıktan sonra sonuç listesinden yalnızca ilk 3 satırı almamızı sağlar. Sıralama olmadan LIMIT kullanmak riskli olur, çünkü hangi 3 satırın geleceği belirsizdir; bu yüzden LIMIT'i genellikle ORDER BY ile birlikte kullanırız.SELECT ad, fiyat FROM urunler ORDER BY fiyat DESC LIMIT 3; - Sorguyu çalıştırıp sonucu kontrol edin: sadece 3 satır ve bunlar en yüksek fiyatlı ürünler olmalı.
- Birden fazla sütuna göre sıralamayı da deneyelim. Örneğin önce stok durumuna, aynı stok değerine sahip ürünler arasında da fiyata göre sıralamak isteyelim:
Bu sorgu önce stok sütununa göre büyükten küçüğe sıralar; stok değeri aynı olan ürünler varsa, bu ürünleri kendi aralarında fiyat sütununa göre küçükten büyüğe sıralar.SELECT ad, stok, fiyat FROM urunler ORDER BY stok DESC, fiyat ASC; - Son olarak WHERE ile ORDER BY ve LIMIT'i birlikte kullanalım. Sadece stoğu 10'dan fazla olan ürünler arasında en pahalı 5 ürünü bulmak için:
Burada sıralama önemlidir: SQL önce WHERE ile satırları süzer, sonra ORDER BY ile sıralar, en son LIMIT ile sonuç sayısını kısıtlar. Bu, günlük hayatta önce elemek, sonra dizmek, en son üstten belirli sayıda almak gibi düşünülebilir.SELECT ad, fiyat, stok FROM urunler WHERE stok > 10 ORDER BY fiyat DESC LIMIT 5;
Sık karşılaşılan sorunlar
| Hata veya durum | Olası çözüm |
|---|---|
| Sorgu "syntax error" veriyor | ORDER BY ve LIMIT satırlarının doğru sırada olduğundan emin olun; LIMIT her zaman ORDER BY'dan sonra gelir, önce yazılamaz. |
| LIMIT komutu çalışmıyor veya tanınmıyor | Kullandığınız veritabanı sistemine göre LIMIT yerine farklı bir ifade gerekebilir (bazı sistemlerde TOP kullanılır); kullandığınız programın belgelerine bakın. |
| Sıralama beklediğim gibi olmadı | DESC veya ASC yazıp yazmadığınızı kontrol edin; hiçbir şey yazmazsanız varsayılan olarak küçükten büyüğe sıralanır. |
| Birden fazla sütun sıralamasında sonuç kafa karıştırıcı | Sıralamayı tek sütunla test edip sonra ikinci sütunu ekleyin; her adımda sonucu kontrol edin. |
| LIMIT ile eksik veya farklı satırlar geliyor | Önce ORDER BY olmadan LIMIT kullanmadığınızdan emin olun; sıralama olmadan hangi satırların geleceği garanti değildir. |
Mini görev
Kendi tablonuzda (veya bu ders için verilen örnek urunler tablosunda) şu üç sorguyu kendi başınıza yazıp çalıştırın:
- Tüm ürünleri fiyata göre küçükten büyüğe sıralayan bir sorgu yazın.
- Stoğu en az olan 3 ürünü bulan bir sorgu yazın (stok sütununa göre küçükten büyüğe sıralayıp LIMIT 3 kullanın).
- Fiyatı 50'den büyük olan ürünler arasında en pahalı 2 ürünü bulan bir sorgu yazın (WHERE, ORDER BY ve LIMIT'i birlikte kullanın).
Kontrol listesi:
- Her sorgu hatasız çalıştı mı?
- Sıralama yönü (küçükten büyüğe veya büyükten küçüğe) istediğiniz gibi mi?
- LIMIT ile gelen satır sayısı beklediğiniz kadar mı?
- WHERE, ORDER BY ve LIMIT'i doğru sırada mı yazdınız?
Kendini sına
1) ORDER BY ifadesinin görevi nedir?
2) Bir sorguda sıralama yönünü büyükten küçüğe çevirmek için hangi kelimeyi kullanırız?
3) LIMIT 5 ifadesi ne yapar?
4) Bir sorguda WHERE, ORDER BY ve LIMIT birlikte kullanıldığında SQL bunları hangi sırayla uygular?
5) ORDER BY kullanmadan LIMIT kullanmak neden risklidir?
Cevaplar
1) ORDER BY, sorgu sonucundaki satırları belirtilen bir sütuna göre sıralamak için kullanılır.
2) DESC (descending) kelimesi kullanılır; büyükten küçüğe sıralama sağlar.
3) Sonuç listesinden yalnızca ilk 5 satırı alır, kalan satırları göstermez.
4) Önce WHERE ile satırlar süzülür, sonra ORDER BY ile sıralanır, en son LIMIT ile sonuç sayısı sınırlanır.
5) Çünkü sıralama olmadan hangi satırların "ilk" sayılacağı garanti değildir; farklı çalıştırmalarda farklı satırlar gelebilir.
Bir sonraki derste GROUP BY ile satırları belirli bir sütuna göre gruplayıp her grup için toplam, ortalama veya sayım gibi özet değerler hesaplamayı öğreneceğiz.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol