- Sorun nedir ve nerede karşımıza çıkar?
- LEFT JOIN ve IS NULL ile anti join
- NOT EXISTS ile varlık denetimi
- NOT IN ve NULL tuzağı
- EXCEPT ile küme farkı
- Değer farkı: anahtar aynı, içerik farklı
- Örnek mutabakat akışı ve sık yapılan hatalar
- Mindset programlarında bu beceriyi nerede çalışırsınız?
- Sık sorulan sorular
SQL'de Tablolar Arasındaki Farkı Bulmak: Anti Join, NOT EXISTS ve EXCEPT
LEFT JOIN IS NULL, NOT EXISTS, NOT IN ve EXCEPT ile tablolar arasındaki farkı bulma: hangi yöntem ne zaman seçilir, NULL tuzağı ve mutabakat örneği.
Sorun nedir ve nerede karşımıza çıkar?
Veri işinin en sık sorularından biri şudur: 'Bu tabloda olup şu tabloda olmayan kayıtlar hangileri?' Siparişi olup faturası kesilmemiş müşteriler, kayıt olmuş ama hiç giriş yapmamış kullanıcılar, ürün kataloğunda olup stok tablosunda karşılığı bulunmayan ürünler, kaynak sistemden gelip hedef sisteme aktarılmamış satırlar bunun örnekleridir. Veritabanı dilinde bu işleme anti join ya da fark sorgusu denir.
İşin güzel yanı, SQL'in bunun için birden fazla doğru yolu olmasıdır. Kötü yanı, bu yolların davranışlarının küçük ama önemli farklar taşımasıdır: NULL değerlere tepkileri, tekrarlayan satırlara yaklaşımları ve performansları farklıdır. Doğru yöntemi seçmek için önce farkın hangi anlamda arandığını netleştirmek gerekir: anahtar var mı yok mu (varlık farkı), yoksa aynı anahtara sahip satırlarda değerler farklı mı (değer farkı)?
LEFT JOIN ve IS NULL ile anti join
En tanıdık kalıp, kaynak tabloyu karşılaştırılan tabloya LEFT JOIN ile bağlayıp eşleşmeyen satırları süzmektir. Eşleşme bulunamayan satırlarda sağ tablonun sütunları NULL gelir; bu sütunlardan birinin NULL olduğu satırları WHERE ile seçersiniz. Mantık şöyledir: önce hepsini birleştir, sonra karşılığı olmayanları ayıkla.
Bu kalıpta dikkat edilecek nokta, NULL kontrolünü sağ tablonun anahtar sütunu üzerinde yapmaktır; çünkü anahtar eşleşmişse asla NULL olamaz. Bir başka kritik nokta, ek koşulların yeridir. Sağ tabloya ait bir koşulu WHERE içine yazarsanız LEFT JOIN fiilen INNER JOIN gibi davranır ve eşleşmeyen satırlar kaybolur. Sağ tabloya ait süzme koşulları ON bölümüne yazılmalıdır. Bu, anti join sorgularında en sık görülen hatadır ve sonuç genellikle sessizce yanlış çıkar.
Bir başka incelik de sağ tabloda aynı anahtarın birden çok kez bulunmasıdır. Eşleşen anahtar için sağ tarafta çok sayıda satır varsa sol satır birden çok kez çıkar; ama anti join'de zaten yalnız eşleşmeyenler seçildiği için bu çoğalma burada sorun yaratmaz. Çoğalma, varlık farkı değil değer farkı sorgularında önem kazanır.
NOT EXISTS ile varlık denetimi
NOT EXISTS, 'şu koşulu sağlayan bir satır sağ tabloda yok mu?' diye soran bir alt sorgudur. Her sol satır için sağ tabloda eşleşen en az bir satır olup olmadığına bakılır; yoksa sol satır sonuca girer. Anahtar karşılaştırması alt sorgunun içinde, sol tabloya referans veren bir koşulla yapılır (korelasyonlu alt sorgu).
Bu yöntemin güçlü yanı NULL güvenliğidir ve niyeti okunaklı bir cümleye dönüştürmesidir: 'faturası olmayan siparişler'. Çoğu modern veritabanı motoru NOT EXISTS ve LEFT JOIN IS NULL kalıplarını benzer yürütme planıyla çalıştırır, ancak bu garanti değildir; büyük tablolarda yöntemleri yürütme planı üzerinden karşılaştırmak iyi bir alışkanlıktır. Alt sorgu içinde SELECT listesi önemli değildir; sadece satırın varlığı sorgulanır.
Mantığı tersine çevirmek kolaydır: NOT EXISTS yerine EXISTS yazdığınızda tablolarda ortak olan kayıtları bulursunuz. Aynı sorguyu yön değiştirerek çalıştırmak, farkın hangi tarafta olduğunu görmenin pratik yoludur.
NOT IN ve NULL tuzağı
NOT IN, alt sorgudan dönen liste içinde olmayan değerleri seçer. Yazımı en kısadır ve ilk bakışta en doğal olanıdır, ama güvenilir bir tuzağı vardır: alt sorgunun döndürdüğü listede tek bir NULL bulunuyorsa, NOT IN hiçbir satır döndürmez. Bunun nedeni SQL'in üç değerli mantığıdır: bir değerin NULL'a eşit olup olmadığı bilinmez, dolayısıyla 'listede yok' ifadesi doğru çıkamaz. Sonuç tamamen boş gelir ve sorgu hata vermediği için fark edilmesi zordur.
Bu yüzden karşılaştırılan sütunun NULL içerebildiği durumlarda NOT IN kullanmayın; ya listeden NULL'ları açıkça çıkarın ya da NOT EXISTS tercih edin. Sütun NOT NULL kısıtlıysa ve değer sayısı küçükse NOT IN sorunsuz çalışır, fakat alışkanlık olarak NOT EXISTS daha güvenlidir.
EXCEPT ile küme farkı
EXCEPT, küme işlemidir: ilk sorgunun sonucundan sonraki sorgunun sonucunu çıkarır. Satırın tamamını karşılaştırır ve sonuçtan tekrarlayan satırları eler. Bu yüzden tabloların ya da sorguların tüm sütunlarının aynı olup olmadığını denetlemek için çok kullanışlıdır: veri göçü sonrası kaynakta olup hedefte bulunmayan satırlar bu yolla bulunur. Sütun sayısının, sırasının ve veri tiplerinin sorgularda uyumlu olması gerekir.
EXCEPT'in bir ayırt edici özelliği, karşılaştırmada NULL değerleri eşit kabul etmesidir; yani karşılaştırılan satırlarda aynı sütun NULL ise o sütun farklı sayılmaz. Bu, JOIN ile yapılan karşılaştırmanın tersidir ve çoğu zaman istenen davranıştır. Bazı veritabanlarında bu işleç farklı bir adla bulunur (örneğin Oracle'da MINUS) ve bazılarında yalnızca belirli sürümlerden itibaren desteklenir; kullandığınız ürünün belgesine bakın.
EXCEPT yalnızca ortak sütunlar üzerinde işler; sonuçta yalnız seçtiğiniz sütunlar gelir. Eksik kaydın diğer ayrıntılarına (müşteri adı, tarih) ihtiyacınız varsa farkı bulduktan sonra bu sonucu ana tabloyla yeniden birleştirmeniz gerekir. Bu durumda LEFT JOIN ya da NOT EXISTS daha doğrudan sonuç verir.
Değer farkı: anahtar aynı, içerik farklı
Bazen her tabloda kayıt var, ama içindeki değerler farklıdır: aynı müşterinin adresi bir sistemde güncel, diğerinde eski. Bu durumda önce anahtar üzerinden INNER JOIN yaparsınız, ardından karşılaştırmak istediğiniz sütunların farklı olduğu satırları süzersiniz. NULL ile çalışırken sıradan eşitsizlik karşılaştırması yanıltıcıdır, çünkü NULL ile bir değerin karşılaştırılması bilinmeyen sonuç verir. NULL'ı da farklılık sayan 'null güvenli' karşılaştırma işleçlerini kullanın ya da sütunları açıkça COALESCE ile aynı varsayılan değere çevirin.
Karşılaştırmaya girmeden önce verinin temizliği önemlidir: baştaki ve sondaki boşluklar, büyük küçük harf farkları, metin olarak saklanan sayılar, farklı tarih biçimleri 'fark' gibi görünür ama gerçek bir fark değildir. Örneğin bir sistemde müşteri kodu boşluklu, diğerinde boşluksuz kaydedilmişse anahtarlar eşleşmez ve tüm satırlar 'eksik' çıkar. Karşılaştırmadan önce TRIM ve tip dönüşümü uygulamak bu sahte farkları ortadan kaldırır.
Örnek mutabakat akışı ve sık yapılan hatalar
Örneğin muhasebe, satış sisteminin sipariş tablosunu fatura tablosuyla karşılaştırmak istiyor. Akış şöyle olabilir:
- Önce anahtarın gerçekten tekil olduğunu doğrulayın; sipariş numarası fatura tablosunda tekrar ediyorsa varlık farkı sorgusu bile yanlış yorumlanabilir.
- Ardından NOT EXISTS ile faturası olmayan siparişleri listeleyin.
- Sonra yönü çevirip siparişi olmayan faturaları bulun. Yönlerin sonucu farklıdır ve her biri mutabakat için gereklidir.
- Son olarak ortak kayıtlarda tutar ve tarih alanlarını karşılaştırıp değer farklarını çıkarın.
Sık hatalar şunlardır: sağ tablo koşulunu WHERE içine yazmak, NULL içeren sütunda NOT IN kullanmak, anahtarı temizlemeden karşılaştırmak, tek yönlü fark bakıp diğer yönü unutmak ve yürütme planına bakmadan büyük tabloda yöntem seçmek. Karşılaştırılan anahtar sütunlarında uygun dizin bulunması, büyük tablolarda sorgu süresini belirgin biçimde etkiler.
Mindset programlarında bu beceriyi nerede çalışırsınız?
SQL ile Veri Sorgulama (Temel) programındaki 'Tablo Birleştirme: JOIN Teknikleri' ve 'Koşullu İfadeler ve Değer Dönüşümleri' modülleri, LEFT JOIN kalıbının ve NULL davranışının temelini verir. SQL ile Veri Sorgulama (İleri) programının 'Alt Sorgular ve Korelasyon Teknikleri' modülü NOT EXISTS mantığını, 'Sorgu Performansı ve Yürütme Planı Analizi' modülü ise büyük tablolarda yöntem karşılaştırmasını kapsar. Veri aktarımı sonrası kontrol yapan analistler, raporlama ve muhasebe operasyonu ekipleri için bu içerik doğrudan günlük işe karşılık gelir.
İlgili Mindset programı
SQL ile Veri Sorgulama (Temel)
Sık sorulan sorular
Bir tabloda olup diğerinde olmayan kayıtları bulmanın en hızlı yolu hangisi?
Tek bir en hızlı yol yoktur; veritabanı motoru, dizinler ve veri büyüklüğü belirler. NOT EXISTS ve LEFT JOIN IS NULL çoğu motorda benzer plan üretir. Büyük tablolarda yöntemlerin yürütme planını karşılaştırın ve karşılaştırılan anahtarlarda dizin bulunduğundan emin olun.
NOT IN neden bazen hiç satır döndürmüyor?
Alt sorgunun döndürdüğü listede en az bir NULL varsa NOT IN hiçbir satır döndürmez, çünkü SQL'in üç değerli mantığında NULL ile karşılaştırma bilinmeyen sonuç verir. Çözüm, NOT EXISTS kullanmak ya da alt sorgudan NULL değerleri açıkça elemektir.
EXCEPT ile LEFT JOIN arasındaki temel fark nedir?
EXCEPT satırın tamamını karşılaştırır, tekrarları eler ve NULL değerleri eşit sayar; sonuçta yalnız karşılaştırılan sütunlar bulunur. LEFT JOIN ise anahtar üzerinden çalışır, sol tablonun tüm sütunlarını döndürebilir ve NULL eşleşmelerini varsayılan olarak eşleşmez kabul eder.
Hangi veritabanında EXCEPT yerine MINUS kullanılır?
İki işleç de ilk sorguda olup ikincisinde bulunmayan farklı satırları verir; iki sorgunun sütun sayısı ve türleri uyumlu olmalıdır. Oracle gibi bazı sistemlerde aynı işi MINUS işleci yapar. Diğer ürünlerde EXCEPT bulunur ve desteği sürüme göre değişebilir. Kullandığınız veritabanının resmî belgesinde işleç adını ve davranışını kontrol etmek gerekir.
Karşılaştırma sonucunda sahte farklar çıkıyorsa ne yapmalıyım?
Anahtar ve değer sütunlarında boşluk, büyük küçük harf ve tip farklarını inceleyin. TRIM, UPPER ve açık tip dönüşümü uygulayarak tarafları aynı biçime getirin. Tarih ve sayı alanlarının metin olarak saklanıp saklanmadığını da kontrol edin.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası