INNER JOIN mi LEFT JOIN mi? Eşleşmeyen Satırların Kaderi
Karşılaştırma

INNER JOIN mi LEFT JOIN mi? Eşleşmeyen Satırların Kaderi

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

INNER JOIN yalnız eşleşen satırları, LEFT JOIN sol tablonun tamamını getirir. NULL davranışı, ON ile WHERE tuzağı ve doğru seçim ölçütleri.

Ortak zemin: tabloları bir koşulla eşleştirmek

INNER JOIN ve LEFT JOIN, ilişkisel veritabanında tabloları bir birleştirme koşulu üzerinden yan yana getiren ayrı birleştirme türleridir. İkisi de aynı söz dizimini kullanır: FROM ile başlayan tablo sol taraf, JOIN anahtar sözcüğünden sonra gelen tablo sağ taraftır ve ON ifadesi hangi satırların birbiriyle eşleşeceğini söyler. Tipik koşul, bir tablodaki yabancı anahtarın diğer tablodaki birincil anahtara eşit olmasıdır, örneğin siparişler tablosundaki müşteri kimliğinin müşteriler tablosundaki kimlikle eşleşmesi.

Bu türlerin eşleşen satırlar için ürettiği sonuç aynıdır. Ayrıldıkları tek nokta, eşleşme bulamayan satırlara ne olduğudur. Bu küçük görünen ayrım raporun kapsamını değiştirir: bir müşteri listesinden sipariş vermemiş müşterilerin sessizce düşmesi ya da listede boş sipariş bilgisiyle kalması, aynı soruya farklı cevaplar demektir.

INNER JOIN yalnızca eşleşen satırları döndürür

INNER JOIN, sol tablodaki her satır için sağ tabloda birleştirme koşulunu sağlayan her satırla bir sonuç satırı üretir. Sağda karşılığı olmayan sol satırlar ve solda karşılığı olmayan sağ satırlar sonuca hiç girmez. Bu yüzden INNER JOIN bir kesişim gibi davranır: sonuçta yalnızca her tarafta kaydı olan varlıklar kalır.

Örneğin müşteriler ile siparişler tablosunu INNER JOIN ile birleştirdiğinizde, hiç sipariş vermemiş müşteri sonuçta görünmez. Birden fazla siparişi olan müşteri ise her siparişi için ayrı bir satırda tekrar eder. JOIN yazıp tür belirtmediğinizde standart SQL ve yaygın veritabanları bunu INNER JOIN olarak yorumlar.

INNER JOIN şu durumlarda doğal seçimdir: • Sorunun kendisi her tarafta kayıt olmasını gerektiriyorsa (sipariş vermiş müşteriler, faturası kesilmiş teslimatlar). • Sağ tablodaki bilgi olmadan satırın raporda anlamı yoksa. • Referans bütünlüğü yabancı anahtarla güvence altındaysa ve eşleşmeyen satır beklenmiyorsa.

LEFT JOIN sol tablonun tamamını korur

LEFT JOIN, tam adıyla LEFT OUTER JOIN, önce INNER JOIN ile aynı eşleştirmeyi yapar. Ardından sağ tabloda hiçbir satırla eşleşmeyen her sol satırı da sonuca ekler ve bu satırlarda sağ tablonun sütunlarını NULL ile doldurur. Sonuç olarak sol tablodaki her satır en az bir kez sonuçta yer alır.

Aynı müşteri ve sipariş örneğinde LEFT JOIN kullanırsanız sipariş vermemiş müşteriler de listede kalır, ancak sipariş numarası, tarih ve tutar sütunları boş (NULL) gelir. Bu davranış, “herkesi göster, varsa ilgili bilgiyi ekle” türündeki soruların temelidir: tüm çalışanlar ve varsa atanmış eğitimleri, tüm ürünler ve varsa son satış tarihleri, tüm şubeler ve varsa açık şikâyetleri.

LEFT JOIN'de tablo sırası anlam taşır. Hangi tablonun eksiksiz korunmasını istiyorsanız onu FROM'a, isteğe bağlı bilgiyi taşıyan tabloyu JOIN'den sonraya yazarsınız. Sırayı ters çevirmek, korunan tarafı da değiştirir.

INNER JOIN ve LEFT JOIN yan yana

Ölçüt, eşleşmeyen sol satırlar: INNER JOIN bu satırları sonuçtan çıkarır / LEFT JOIN bu satırları korur ve sağ sütunları NULL ile doldurur.

Ölçüt, sonuç satır sayısının alt sınırı: INNER JOIN sol tablodan daha az satır döndürebilir / LEFT JOIN, sol tablodaki satır sayısından az satır döndürmez; sağ tarafta çoklu eşleşme varsa daha fazlasını döndürür.

Ölçüt, tablo sırası: INNER JOIN'de tabloların yerini değiştirmek sonucu değiştirmez / LEFT JOIN'de hangi tablonun solda olduğu sonucu belirler.

Ölçüt, NULL beklentisi: INNER JOIN sonucunda sağ tablodan gelen sütunlar, kaynak veride boş değilse boş gelmez / LEFT JOIN sonucunda sağ sütunların boş gelmesi olağandır ve sorgunun geri kalanı buna göre yazılmalıdır.

Ölçüt, filtre konumu: INNER JOIN'de koşulu ON'a ya da WHERE'e yazmak aynı sonucu verir / LEFT JOIN'de koşulun yeri sonucu kökten değiştirir.

Ölçüt, yaygın kullanım: INNER JOIN işlem ve eşleşme raporlarında / LEFT JOIN kapsama, eksik kayıt ve “hiç yapılmamış” analizlerinde.

ON mu WHERE mi: LEFT JOIN'in en sık tuzağı

PostgreSQL belgelerinde açıkça belirtildiği gibi ON ifadesindeki bir kısıt birleştirmeden önce, WHERE ifadesindeki kısıt ise birleştirmeden sonra uygulanır. INNER JOIN için bu fark önemsizdir; dış birleştirmede ise sonucu tamamen değiştirir.

Örneğin tüm müşterileri ve yalnızca iptal edilmemiş siparişlerini görmek istiyorsunuz. Sipariş durumu koşulunu ON ifadesine eklerseniz, iptal edilmiş siparişler eşleşmeden çıkar ama müşteri satırı korunur; yalnızca iptal edilmiş siparişi olan müşteri listede boş sipariş bilgisiyle kalır. Aynı koşulu WHERE'e yazarsanız, birleştirmeden sonra sipariş durumu NULL olan satırlar da koşulu sağlamadığı için elenir ve LEFT JOIN fiilen INNER JOIN'e dönüşür. Sipariş vermemiş müşteriler sessizce kaybolur.

Pratik kural şudur: sağ tabloyu daraltan koşullar LEFT JOIN'de ON içine, sonucun tamamını daraltan koşullar WHERE içine yazılır. WHERE'de sağ tablonun bir sütununu kullanmanız gerekiyorsa, NULL durumunu da hesaba katan bir ifade kurun ya da sorgunun gerçekten INNER JOIN mantığı istediğinden emin olun.

Sorguya göre birleştirme türü seçmek

Seçimi, rapordaki satırın neyi temsil ettiğine göre yapın. Satır bir olayı temsil ediyorsa (sipariş, ödeme, ziyaret) ve olayın tarafları da zorunluysa INNER JOIN uygundur. Satır bir ana varlığı temsil ediyorsa (müşteri, çalışan, ürün) ve bu varlıkların tamamını görmek istiyorsanız LEFT JOIN uygundur.

Şu sorular kararı netleştirir: • Eşleşmeyen sol satırların sonuçta görünmesi soruyu doğru cevaplar mı? Evet ise LEFT JOIN. • Eşleşmeyen satır veri hatası mı demek? Öyleyse INNER JOIN ile gizlemek yerine LEFT JOIN ile bulup düzeltmek daha sağlıklıdır. • “Hiç sipariş vermemiş müşteri” gibi bir yokluk mu arıyorsunuz? LEFT JOIN yapıp sağ tablonun anahtarının NULL olduğu satırları süzmek bilinen bir kalıptır; NOT EXISTS ile yazılan alt sorgu da aynı soruyu cevaplar. • Ardışık birleştirmelerde bir LEFT JOIN'den sonra aynı zincire INNER JOIN eklemek, korumak istediğiniz satırları yeniden eleyebilir. Zincirin tamamında hangi satırların korunacağını baştan planlayın.

Sık hatalar ve sonucu doğrulama yöntemi

Birleştirme hataları sinsidir: sorgu hata vermeden yanlış sonuç üretir ve kimse fark etmez. Şu kontroller bu riski azaltır: • Satır çoğalması: Sağ tabloda bir anahtara birden çok satır karşılık geliyorsa her tür satırları çoğaltır. Toplam tutar gibi değerleri birleştirmeden sonra topladığınızda sonuç şişer. Önce sağ tabloyu anahtar düzeyinde özetleyip sonra birleştirin. • Yanlış sayım: LEFT JOIN sonrasında COUNT(*) eşleşmeyen satırları da bir kayıt olarak sayar. Sipariş sayısını bulmak için sağ tablonun bir sütununu sayan COUNT ifadesi kullanın; bu ifade NULL değerleri saymaz. • Anahtar türü uyumsuzluğu: Metin ve sayı türündeki anahtarları birleştirmek, örtük dönüşüm nedeniyle eşleşme kaybına ya da performans sorununa yol açabilir. • NULL ile eşitlik: Birleştirme sütununda NULL olan satırlar eşittir karşılaştırmasıyla hiçbir satırla eşleşmez.

Doğrulama için birleştirmeden önce ve sonra satır sayılarını karşılaştırın, eşleşmeyen satırları ayrıca listeleyin ve sonuçtan birkaç kaydı kaynak tablolarla elle kontrol edin.

Birleştirme türlerini Mindset programlarında çalışmak

SQL ile Veri Sorgulama (Temel) programında “Tablo Birleştirme: JOIN Teknikleri” modülü bu konuyu doğrudan ele alır; aynı programdaki “Toplulaştırma Fonksiyonları ve Gruplama” ile “Pratik İş Raporları ile Sorgu Geliştirme” modülleri, birleştirme sonrası sayım ve özetleme hatalarının pratikte nerede ortaya çıktığını görmeye zemin hazırlar.

SQL ile Programlama Eğitimi'nde birleştirmeler “Join Kullanımı (Joins)” modülünde, tablo oluşturma, sorgular ve görüntülemelerle birlikte işlenir. Doğal dilden SQL üretmek isteyenler için LLM ile Veri Sorgulama (Text-to-SQL) programındaki “Sonuç Doğrulama ve Güvenlik” modülü, üretilen sorgudaki yanlış birleştirme türünü yakalamanın neden ayrı bir adım gerektirdiğini gösterir.

İlgili Mindset programı

SQL ile Veri Sorgulama (Temel)

Sık sorulanlar

Sık sorulan sorular

LEFT JOIN ile LEFT OUTER JOIN aynı şey mi?

Evet. OUTER sözcüğü isteğe bağlıdır ve LEFT JOIN yazımı LEFT OUTER JOIN ile aynı birleştirmeyi yapar. Benzer biçimde tür belirtmeden yazılan JOIN de INNER JOIN anlamına gelir. Okunabilirlik için ekip içinde tek bir yazım biçiminde anlaşmak, kod incelemelerinde karışıklığı azaltır.

LEFT JOIN, INNER JOIN'den daha mı yavaştır?

Genel bir kural olarak söylenemez. Performansı birleştirme türünden çok indeksler, tablo boyutları ve sorgu planlayıcısının seçtiği yöntem belirler. Ancak LEFT JOIN, planlayıcının tablo sırasını serbestçe değiştirmesini sınırlayabilir. Sonuçta gerçekten tüm sol satırlara ihtiyaç yoksa INNER JOIN kullanmak hem anlamı netleştirir hem planlayıcıya daha fazla seçenek bırakır.

RIGHT JOIN ne zaman kullanılır?

RIGHT JOIN, LEFT JOIN'in ayna görüntüsüdür: sağ tablonun tamamını korur. Aynı sonucu tabloların yerini değiştirip LEFT JOIN ile yazmak her zaman mümkündür. Bu nedenle birçok ekip okunabilirlik için yalnızca LEFT JOIN kullanmayı ve korunacak tabloyu hep sola yazmayı tercih eder.

LEFT JOIN sonucundaki NULL değerleri nasıl gösteririm?

Raporda boş görünmesini istemediğiniz sütunlar için COALESCE fonksiyonuyla varsayılan bir değer atayabilirsiniz; örneğin tutar yoksa boş yerine bir varsayılan değer, açıklama yoksa “kayıt yok” yazdırmak gibi. Bu dönüşümü yalnızca gösterim katmanında yapın; toplama ve ortalama hesaplarında NULL ile sıfırın farklı anlam taşıdığını unutmayın.

FULL OUTER JOIN bu ikisinden nasıl ayrılır?

FULL OUTER JOIN, her tablonun eşleşmeyen satırlarını korur: soldan eşleşmeyenler sağ sütunlar boş olarak, sağdan eşleşmeyenler sol sütunlar boş olarak sonuca girer. Kaynak sistemleri karşılaştırıp hangisinde fazladan kayıt olduğunu bulmak gibi mutabakat işlerinde kullanılır. Her veritabanı bu türü desteklemez; MySQL bunlardan biridir.

INNER JOIN ile LEFT JOIN Farkı ve Kullanımı