0Pricing
SQL Interview Prep · Ders

Dış Birleştirmede WHERE Kullanma Tuzağı

Dış birleştirilmiş bir sütunu WHERE içinde filtrelemenin onu nasıl sessizce iç birleştirmeye dönüştürdüğünü öğrenin.

Dış Birleştirmede WHERE Kullanma Tuzağı, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Herkesi Yakalayan Tuzak

Bu, görüşmecilerin kurduğu en yaygın dış birleştirme hatasıdır: "2024'teki siparişleriyle birlikte her müşteriyi gösterin; 2024'te siparişi olmayan müşteriler de dahil olsun."

Aday bir LEFT JOIN yazar, ardından WHERE içinde tarih filtresi ekler ve 2024'te siparişi olmayan müşteriler fark ettirmeden kaybolur. LEFT JOIN sessizce INNER JOIN olur. Bunun nedenini anlamak, kıdemli düzeyde bilgi sahibi olduğunuzu gösterir.

Hatalı Sorgu

Hata burada. Mantıklı görünüyor: tüm müşterileri tutun, siparişlerini birleştirin, sonuçları 2024 ile sınırlayın.

Ancak hiç siparişi olmayan veya 2024'te siparişi olmayan müşteriler sonuçtan kaybolur. Onları dahil etme gereksinimi karşılanmaz.

-- BUG: drops customers with no 2024 order
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_date >= '2024-01-01';

Neden Bozulur

İşlem sırasını hatırlayın: JOIN önce gerçekleşir ve eşleşmeyen müşterilerin her sipariş sütununda NULL bulunan satırlar üretir. Ardından WHERE çalışır.

Eşleşmeyen bir müşteri için o.order_date NULL'dur; dolayısıyla o.order_date >= '2024-01-01' ifadesi TRUE değil, UNKNOWN olarak değerlendirilir. WHERE yalnızca TRUE olan satırları tuttuğu için NULL satırları, yani LEFT JOIN'in korumak için uğraştığı satırları, eler.

NULL Filtreyi Boşa Çıkarır

NULL ile yapılan her karşılaştırma UNKNOWN üretir: NULL >= '2024-01-01' UNKNOWN'dur, NULL = 5 UNKNOWN'dur, hatta NULL <> 5 bile UNKNOWN'dur.

WHERE yalnızca TRUE olarak değerlendirilen satırları geçirdiğinden, korunan her eşleşmeme satırı elenir. Sağ tablo sütunundaki tek bir WHERE koşulu, dış birleştirmenin bütün amacını boşa çıkarır.

Çözüm: Filtreyi ON İçine Taşıyın

Filtreyi ON yan tümcesine taşıyın. Böylece filtre eşleşme koşulunun bir parçası olur ve satırlar korunmadan önce uygulanır; bu sayede eşleşmeyen müşteriler NULL değerleriyle birlikte kalır.

-- CORRECT: filter lives in ON
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.order_date >= '2024-01-01';
-- customers with no 2024 order: kept, NULL order

ON ve WHERE Tek Cümlede

Görüşmede tekrarlayacağınız kural şudur:

Korunan (dış) tabloyla yapılan birleştirmede diğer tabloya ait koşullar ON içinde; korunan tablonun kendisine ait koşullar ise WHERE içinde yer alır.

  • ON neyin eşleşme sayılacağını belirler (birleştirme sırasında çalışır).
  • WHERE son satırları filtreler (birleştirmeden sonra çalışır ve NULL satırları kaldırır).

Karşılaştırmalı Sonuçlar

Aynı veri, iki yerleşim, farklı sonuçlar. Carol'un 2024 siparişi olmadığını varsayalım.

  • Filtre WHERE içinde: Carol kaybolur. Fiilen bir iç birleştirmedir.
  • Filtre ON içinde: Carol, sipariş sütunları NULL olan tek bir satır olarak görünür; gereksinim karşılanır.

Çıktıdaki fark, bu tuzağın asıl amacıdır.

-- ON version output
-- Alice | 50 | 2024-03-01
-- Bob   | 20 | 2024-05-02
-- Carol | NULL | NULL   <-- preserved

WHERE'nin Aslında Doğru Olduğu Durumlar

Dış birleştirmede kullanılan her WHERE hatalı değildir. Korunan tabloyu filtrelemek uygundur; bu işlem birleştirmeden gelen NULL değerlerini içermez.

Önceki dersteki karşı birleştirme de bu davranıştan yararlanmak için bilerek WHERE o.id IS NULL kullanır. Önemli olan, hangi durumda olduğunuzu bilmektir.

-- Fine: filtering the preserved (left) table
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE c.country = 'US';

Tespit Kuralı

Bir dış birleştirmeyi incelerken, korunmayan tablonun sütunlarına ilişkin koşullar için WHERE yan tümcesini tarayın (IS NULL karşı birleştirme sınamaları hariç).

o.someColumn = ... veya dış tarafta WHERE içinde bir aralık ya da eşitlik sınaması görürseniz bu tuzaktan şüphelenin. Şunu sorun: "Bu işlem LEFT JOIN'i INNER JOIN'e dönüştürüyor mu?" Genellikle dönüştürür.

Birden Çok Koşul

Her iki yerleşimi de birleştirebilirsiniz. Sağ tablodaki eşleşme koşulları ON içinde; sol tablodaki gerçek bir birleştirme sonrası filtresi ise WHERE içinde yer alır. Bu ikisi sorunsuzca birlikte bulunur.

SELECT c.name, o.id, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.amount > 100          -- match condition
WHERE c.signup_year = 2023;    -- preserved-table filter

Bunu Sesli Açıklama

Görüşmede yalnızca düzeltmeyi değil, mekanizmayı da açıklayın:

"Birleştirme önce çalışır ve eşleşmeyen sağ sütunları NULL ile doldurur. Bu sütunlardaki WHERE koşulu, NULL satırları için UNKNOWN olarak değerlendirilir; WHERE TRUE olmayan satırları attığından dış birleştirme iç birleştirmeye çöker. Koşulu ON içine koymak, onu bir eşleşme koşulu olarak tutar ve eşleşmeyen satırları korur." Bu açıklama her seferinde etkili olur.

Hızlı Kontrol

Tüm müşterileri ve yalnızca onların 2024 siparişlerini listelemeli, siparişi olmayan müşterileri de korumalısınız.

Özet

Korunmayan tablonun bir sütununu WHERE içinde filtrelemek, dış birleştirmeyi sessizce iç birleştirmeye dönüştürür; çünkü eşleşmeyen satırlardaki NULL değerleri koşuldan geçemez (UNKNOWN olur) ve WHERE bu satırları eler.

  • Dış tablodaki eşleşme koşulları ON içinde yer alır.
  • Korunan tablodaki filtreler WHERE içinde yer alır.
  • WHERE içindeki IS NULL, bilinçli karşı birleştirmedir; tuzak değildir.
  • Anladığınızı göstermek için işlem sırasını açıklayın.

Sıkça Sorulan Sorular

“Dış Birleştirmede WHERE Kullanma Tuzağı” dersi ücretsiz mi?

Evet — “Dış Birleştirmede WHERE Kullanma Tuzağı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“Dış Birleştirmede WHERE Kullanma Tuzağı” dersinde ne öğreneceğim?

Dış birleştirilmiş bir sütunu WHERE içinde filtrelemenin onu nasıl sessizce iç birleştirmeye dönüştürdüğünü öğrenin. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Dış Birleştirmede WHERE Kullanma Tuzağı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. LEFT JOIN ve Eşleşmeyen Satırları Koruma
  2. RIGHT ve FULL OUTER JOIN Anlamı
  3. Eşleşmesi Olmayan Satırları Bulma (Anti-Join)
  4. Dış Birleştirmede WHERE Kullanma Tuzağı
← SQL Interview Prep Sayfasına Dön