Birleştirme Yayılması ve Satır Çoğalması
Birleştirmenin neden her iki tablodan da daha fazla satır döndürebildiğini ve mülakatçıların bunu nasıl test ettiğini öğrenin.
Birleştirme Yayılması ve Satır Çoğalması, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 3. 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.
Birleştirme Çok Fazla Satır Döndürdüğünde
En açıklayıcı mülakat sorularından biri masum görünür: “Birleştirme, daha büyük tablodan daha fazla satır döndürebilir mi?” Yanıt evettir ve bu olguya dallanma veya satır çoğalması denir.
“Birleştirme yalnızca tabloları bir araya getirir” diyen adaylar bu noktayı kaçırır. Kesin satır sayısını öngörebilen adaylar işe alınır. Bu ders, bu öngörü becerisini geliştirir.
Nedeni: Bire Çok Eşleşmeler
Dallanma, soldaki bir satır sağdaki birçok satırla eşleştiğinde gerçekleşir. Her eşleşme ayrı bir çıktı satırı oluşturur.
Müşteriler ve siparişler örneğinde Ada'nın (tek bir müşteri) iki siparişi vardır. Birleştirme her sipariş için bir satır üretir, bu nedenle Ada tekrarlanır. Müşteri alanları yinelenir; yalnızca sipariş alanları farklıdır.
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id;
-- Ada appears twice (she has 2 orders)
-- name | amount
-- Ada | 50
-- Ada | 20
-- Bob | 99Çıktı Satırlarını Sayma
Çıktı satırı sayısı müşteri sayısına değil, sol satır başına eşleşme sayılarının toplamına eşittir.
- Ada -> 2 sipariş -> 2 satır
- Bob -> 1 sipariş -> 1 satır
- Cleo -> 0 sipariş -> 0 satır (INNER JOIN tarafından atılır)
Toplam 3 satır vardır; müşteriler tablosunda da 3 satır olmasına rağmen. Ada'nın sipariş sayısını 10 yaparsanız sonuç 11 satıra çıkar.
Çoka Çok Eşleşme Patlar
Aynı anahtar için her iki tarafta da birden çok eşleşme olduğunda dallanma katlanır. K anahtarı solda 3, sağda 4 kez görünüyorsa birleştirme bu anahtar için 3 x 4 = 12 satır üretir.
Görünüşte küçük bir birleştirmenin milyonlarca satıra dönüşmesi böyle gerçekleşir. Mülakat yapanlar, çarpımı fark edip etmediğinizi görmek için her iki tarafta da yinelenen anahtarlar vermeyi sever.
-- left has 3 rows with tag 'A', right has 4 rows with tag 'A'
SELECT l.id, r.id
FROM left_t l
JOIN right_t r ON r.tag = l.tag;
-- tag 'A' alone yields 3 * 4 = 12 output rowsToplulaştırma Tuzağı
Mülakat yapanların en sık kurduğu tuzak şudur: Kalem ayrıntılarını almak için siparişleri sipariş kalemleri ile birleştirir, ardından sipariş tutarını SUM ile toplarsınız. Her sipariş birden çok sipariş kalemi satırına dallandığı için sipariş tutarı her kalem için bir kez sayılır.
SUM artık büyük ölçüde şişmiştir. Sorgu doğru göründüğü gibi çalışır da; onu tehlikeli yapan budur.
-- BUG: order.amount duplicated across items
SELECT SUM(o.amount) AS total
FROM orders o
JOIN order_items i ON i.order_id = o.id;
-- a 3-item order counts o.amount 3 timesŞişmeyi Görmek
Bir siparişin tutarının 100 ve üç sipariş kaleminin olduğunu varsayınız. Birleştirme, her biri 100 tutarını taşıyan üç satır üretir. SUM(o.amount) sonucu 100 değil, 300 olur.
Çözüm, doğru ayrıntı düzeyinde toplulaştırma yapmaktır: Kalemleri toplayınız veya ayrı olarak yalnızca farklı siparişleri toplayınız. Dallanmış bir alt kayıt birleştirmesinde üst kayıt değerini asla SUM ile toplamayınız.
o.id | o.amount | i.id
7 | 100 | 71
7 | 100 | 72
7 | 100 | 73
-- SUM(o.amount) = 300 (WRONG, should be 100)1. Çözüm: Alt Kayıtları Önce Toplulaştırma
En temiz çözüm, her üst kaydın tam olarak bir özetlenmiş satırla eşleşmesi için çok olan tarafı bir alt sorguda veya CTE içinde önceden toplulaştırmaktır. Dallanma olmaz, şişme olmaz.
Burada birleştirmeden önce kalemleri sipariş başına tek satıra indirgeriz; böylece üst kayıt tutarı asla yinelenmez.
SELECT o.id, o.amount, i.item_count
FROM orders o
JOIN (
SELECT order_id, COUNT(*) AS item_count
FROM order_items
GROUP BY order_id
) i ON i.order_id = o.id;2. Çözüm: COUNT(DISTINCT) ve Koşullu Toplamlar
Dallanmış birleştirmeden sonra toplulaştırma yapmak zorundaysanız doğru ayrıntı düzeyini sayınız veya toplayınız. Kalem satırlarını değil siparişleri saymak için COUNT(DISTINCT o.id) kullanınız.
Not: SUM(DISTINCT o.amount) güvenli bir çözüm değildir (NOT); çünkü iki farklı siparişin aynı tutara sahip olması mümkündür ve bu siparişler birleştirilmiş olur. Önceden toplulaştırma daha güvenilirdir.
SELECT COUNT(DISTINCT o.id) AS num_orders,
COUNT(i.id) AS num_items
FROM orders o
JOIN order_items i ON i.order_id = o.id;Dallanmayı Sorun Çıkarmadan Önce Saptama
Mülakat yapanların sevdiği hızlı bir tanı yöntemi şudur: Birleştirme anahtarının, “tek” taraf olmasını beklediğiniz tarafta benzersiz olup olmadığını kontrol ediniz. Farklı anahtarların sayısı satır sayısından küçükse o tarafta yinelenenler vardır ve dallanma oluşacaktır.
-- if this returns rows, order_id is NOT unique in order_items
SELECT order_id, COUNT(*) AS n
FROM order_items
GROUP BY order_id
HAVING COUNT(*) > 1;Bir Sayımla Ayrıntı Düzeyinizi Doğrulama
Birleştirilmiş bir sonuç üzerinde herhangi bir toplulaştırmaya güvenmeden önce satır sayısını makuliyet açısından kontrol ediniz. Hızlı bir yöntem, birleştirilmiş sayımı ayrıntı düzeyini temsil etmesini beklediğiniz tablonun sayımıyla karşılaştırmaktır.
Birleştirme üzerindeki COUNT(*), siparişlerin COUNT(*) değerinden büyükse birleştirmede dallanma oluşmuştur ve sipariş başına yapılan tüm toplulaştırmalar risk altındadır. Bu tek satırlık kontrol birçok mülakat yanıtını kurtarmıştır.
-- joined rows should equal order count if no fan-out
SELECT COUNT(*) AS joined_rows
FROM orders o
JOIN order_items i ON i.order_id = o.id;
SELECT COUNT(*) AS order_rows FROM orders;
-- joined_rows > order_rows => fan-out presentDallanma Her Zaman Hata Değildir
Bazen alt kayıt başına bir satır istemek doğrudur. Her sipariş kalemini sipariş üst bilgisiyle birlikte listelemek, doğru bir dallanmadır. Önemli olan hedef ayrıntı düzeyinizi bilmektir: Bir varlık kaç satır üretmelidir?
Sorguyu yazmadan önce ayrıntı düzeyini belirtiniz. “Sipariş kalemi başına bir satır” ile “sipariş başına bir satır” ifadeleri, dallanmanın özellik mi yoksa hata mı olduğuna karar verir.
Hızlı Kontrol
Bire çok birleştirmenin çıktısını öngörünüz.
Özet: Dallanma ve Satır Çoğalması
Hatırlanması gerekenler:
- Birleştirme her eşleşen çift için bir satır üretir; bu nedenle bire çok eşleşmeler “tek” tarafı yineler.
- Çoka çok anahtarlar çarpılır: Bu anahtar için 3 x 4 = 12 satır.
- Üst kayıt değerini dallanmış birleştirme boyunca toplulaştırmak toplamları ve sayımları şişirir.
- Alt kaydı önceden toplulaştırarak veya doğru ayrıntı düzeyinde sayıp toplayarak düzeltiniz (örneğin
COUNT(DISTINCT)). - Önce daima amaçlanan ayrıntı düzeyini belirtiniz; dallanma yalnızca bu düzeyi ihlal ettiğinde hatadır.
Sıkça Sorulan Sorular
“Birleştirme Yayılması ve Satır Çoğalması” dersi ücretsiz mi?
Evet — “Birleştirme Yayılması ve Satır Çoğalması” 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.
“Birleştirme Yayılması ve Satır Çoğalması” dersinde ne öğreneceğim?
Birleştirmenin neden her iki tablodan da daha fazla satır döndürebildiğini ve mülakatçıların bunu nasıl test ettiğini öğ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 3. dersidir.
“Birleştirme Yayılması ve Satır Çoğalması” 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
- INNER JOIN Satırları Nasıl Eşleştirir?
- Birleştirmelerde ON ve WHERE
- Birleştirme Yayılması ve Satır Çoğalması
- Üç veya Daha Fazla Tabloyu Birleştirme