SQL'de NULL, Çoğalan Satırlar ve Performans: Sık Yapılan Hatalar ve Bir Üst Seviyeye Geçiş

Temel sorguları yazabiliyorsunuz. Bu derste asıl hedef, hata mesajı vermeyen ama sonucu sessizce bozan durumları yakalamak. Bir sorgunun çalışması, sonucunun doğru olduğu anlamına gelmez.

1. NULL: Boş Değerin Kuralları

NULL, "sıfır" ya da "boş metin" değildir; bilinmeyen demektir. Bu yüzden normal karşılaştırmalar onunla çalışmaz.

  • Karşılaştırma: teslim_tarihi = NULL hiçbir satırı getirmez. Doğrusu IS NULL veya IS NOT NULL kullanmaktır.
  • Toplama fonksiyonları: SUM, AVG, MIN, MAX NULL satırları yok sayar. AVG, NULL olanları paydaya katmaz; ortalama beklediğinizden yüksek çıkabilir.
  • COUNT farkı: COUNT(*) tüm satırları sayar, COUNT(sütun) yalnızca o sütunu dolu olan satırları sayar.
  • COALESCE: Boş değere varsayılan atar. Örnek: COALESCE(indirim, 0). Bunu bilinçli kullanın; NULL'ı 0 yapmak ortalamayı değiştirir.

2. Sık Yapılan Hatalar

HataBelirtiÇözüm
LEFT JOIN + sağ tabloya WHERE koşuluEşleşmeyen satırlar kayboluyor, JOIN fiilen INNER oluyorKoşulu WHERE yerine ON içine taşıyın
GROUP BY'da sütunu unutmakHata ya da rastgele değer gelir (sisteme göre değişir)SELECT'teki her toplanmamış sütunu GROUP BY'a ekleyin
WHERE ile HAVING karışıklığıToplama sonrası koşul yazılamıyorSatır filtresi WHERE, grup filtresi HAVING
Bitiş günü dışarıda kalıyorAyın son günü eksik çıkıyorAralığı tarih >= '2026-03-01' AND tarih < '2026-04-01' yazın
Büyük/küçük harf ve Türkçe karakter"İstanbul" ile "istanbul" ya da "ISPARTA" ile "Isparta" eşleşmiyorVeriyi standartlaştırın; kullandığınız sistemin harf duyarlılığını ve sıralama (collation) ayarını test edin

Örnek senaryo: Tüm müşterileri ve siparişlerini listelemek istiyorsunuz. Sorguda LEFT JOIN kullanıp WHERE içine siparis_durumu = 'Tamamlandı' yazarsanız, hiç siparişi olmayan müşteriler listeden düşer. Koşulu ON bölümüne yazın.

3. Yanlış Bilinenler

  • "SELECT * her zaman zararsızdır." Küçük tabloda evet; büyük tabloda gereksiz veri taşır, yavaşlatır, tablo yapısı değişince raporu bozar. İhtiyacınız olan sütunları yazın.
  • "Sorgu çalıştıysa sonuç doğrudur." Hata vermemesi yalnızca söz diziminin doğru olduğunu gösterir. Mantık hatasını sistem söylemez.
  • "JOIN her zaman satır sayısını korur." Bire-çok ilişkide satırlar çoğalır; toplamlar şişer.
  • "DISTINCT çoğalmayı çözer." Çoğunlukla sorunu gizler. Önce neden çoğaldığını bulun.

4. Rapor Güvenilirliği: Ölçme Göstergeleri

GöstergeNasıl Kontrol Edilir?
Satır sayısıJOIN öncesi ve sonrası COUNT(*) karşılaştırın; beklenmedik artış çoğalma işaretidir
Bağımsız toplamAynı toplamı JOIN'siz, tek tablodan hesaplayıp rapordakiyle eşleştirin (mutabakat)
Çalışma süresiSorgunun ne kadar sürdüğünü not edin; ani artış uyarıdır
Yeniden üretilebilirlikSorguyu kaydedin, tarih aralığını açıkça yazın; aynı veriyle aynı sonucu vermeli

5. Bir Üst Seviyeye Geçiş

  • CTE (WITH): Karmaşık sorguyu adlandırılmış adımlara bölün; okunması ve denetlenmesi kolaylaşır. Alt sorgular da benzer işi görür.
  • Pencere fonksiyonları: ROW_NUMBER, RANK, SUM(...) OVER gibi yapılar, satırları gruplamadan sıralama ve kümülatif toplam yapmanızı sağlar. Şimdilik tanımanız yeterli.
  • Sade sorgu: Büyük tablolarda yalnızca gerekli sütunları seçin, tarih aralığını daraltın.
  • İndeks: Kitabın sonundaki dizin gibidir; sık filtrelenen sütunlarda aramayı hızlandırır. Kurmak veritabanı yöneticisinin işi olabilir, ama ne işe yaradığını bilmek yavaş sorguyu yorumlamanızı sağlar.

Öz Değerlendirme Listesi

  • NULL olabilecek sütunlarda IS NULL ve COALESCE kullanımını düşündüm mü?
  • LEFT JOIN'in sağ tablosuna WHERE koşulu yazdım mı?
  • JOIN sonrası satır sayısı beklediğim gibi mi?
  • Toplamı bağımsız bir sorguyla doğruladım mı?
  • Bitiş tarihi dahil mi, aralık net mi?
  • Gereksiz sütun ve geniş tarih aralığı var mı?
  • Sorguyu başkası okuyup anlayabilir mi?

Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol