İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma
Performans için ilişkili mantığı birleştirmelere veya pencere işlevlerine dönüştürün.
İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma, 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.
Neden Yeniden Yazmalı
İlişkili alt sorgular okunabilirdir, ancak yavaş olabilir: iç sorgu her dış satır için bir kez çalışabilir. Görüşmeciler performansı artırmak için sizden bir alt sorguyu sık sık birleştirme veya pencere işlevi olarak yeniden yazmanızı ister.
Amaç, iç taramaları tekrarlamak yerine veriler üzerinde tek geçiş yaparak aynı sonucu elde etmektir.
İki veya üç yeniden yazma kalıbını ve her birinin doğruluğu ne zaman koruduğunu bilmek, orta seviye için temel bir beceridir.
1. Kalıp: EXISTS Yerine INNER JOIN
En az bir eşleşmeyi sınayan ilişkili bir EXISTS çoğu zaman INNER JOIN olarak yeniden yazılabilir.
Ancak dikkatli olun: birden fazla iç satır eşleşirse birleştirme yinelenen dış satırlar üretebilir. Dış anahtar başına tek satır elde etmek için DISTINCT ekleyin veya toplulaştırma kullanın.
-- Correlated EXISTS
SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id);
-- Join rewrite (DISTINCT avoids dupes from fan-out)
SELECT DISTINCT c.customer_id, c.name
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id;Satır Çoğalması Tuzağı
En yaygın yeniden yazma hatası satır çoğalmasını unutmaktır. EXISTS, kaç siparişleri olursa olsun her müşteriyi bir kez döndürür. Naif bir birleştirme ise sipariş başına bir satır döndürerek sayıları şişirir.
Sonraki bir adım, birleştirilmiş sonuç üzerinde dikkatli bir gruplama yapmadan COUNT(*) veya SUM(amount) uyguluyorsa sayılar yanlış olur.
Her zaman şunu sorun: birleştirme satırları çoğaltabilir mi? Yanıt evetse satırları yeniden tekilleştirmek için DISTINCT veya bir GROUP BY kullanın.
2. Kalıp: NOT EXISTS Yerine LEFT JOIN / IS NULL
Karşı birleştirme yeniden yazımı, mülakatlarda kesinlikle karşınıza çıkabilecek bir kalıptır. İlişkili bir NOT EXISTS, sağ tarafı NULL olan bir LEFT JOIN ifadesine dönüştürülür.
Eşleşmeyen dış satırlar sağ tarafta NULL değerleri alır; bu NULL değerine göre filtrelemek, tam olarak eşleşmesi olmayan satırları tutar.
-- Correlated NOT EXISTS
SELECT c.customer_id FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id);
-- LEFT JOIN / IS NULL rewrite
SELECT c.customer_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
WHERE o.customer_id IS NULL;Sınamak İçin NULL Olamayan Bir Sütun Seçin
LEFT JOIN / IS NULL yeniden yazımında, gerçek bir eşleşmede hiçbir zaman NULL olmayan bir sağ taraf sütununu sınayın; ideal olarak bu sütun birleştirme anahtarı veya birincil anahtar olmalıdır.
NULL olabilen bir sütunu sınarsanız gerçek bir eşleşmeme durumunu (satır yok) yalnızca orada NULL bulunan eşleşmiş bir satırdan ayırt edemezsiniz. Bu hata yanlış satırları döndürür.
Birleştirme anahtarını (burada o.customer_id) veya o.order_id kullanmak, NULL değerinin "eşleşen satır yok" anlamına gelmesini garanti eder.
3. Kalıp: Skaler Toplulaştırmayı JOIN + GROUP BY ile Yeniden Yazma
SELECT içindeki ilişkili bir toplulaştırma, gruplandırılmış bir alt sorguyla (türetilmiş tabloyla) yapılan birleştirmeye dönüştürülebilir.
Grup başına toplulaştırmayı bir kez hesaplayın, ardından bunu ayrıntı satırlarına geri JOIN edin. İç sorgu satır başına değil, yalnızca bir kez çalışır.
-- Correlated scalar aggregate
SELECT e1.name,
(SELECT MAX(e2.salary) FROM employees e2
WHERE e2.dept_id = e1.dept_id) AS dept_max
FROM employees e1;
-- Join + GROUP BY rewrite
SELECT e.name, m.dept_max
FROM employees e
JOIN (SELECT dept_id, MAX(salary) AS dept_max
FROM employees GROUP BY dept_id) m
ON m.dept_id = e.dept_id;4. Kalıp: Pencere İşleviyle Yeniden Yazma
Çoğu zaman en temiz yeniden yazım bir pencere işlevidir. MAX(salary) OVER (PARTITION BY dept_id), ilişkili toplulaştırmanın tamamının yerini alır; birleştirme gerekmez.
Grup değerini tek geçişte hesaplar ve her ayrıntı satırını korur. Bu, analiz sorguları için görüşmecilerin genellikle en çok görmek istediği yanıttır.
SELECT name,
dept_id,
salary,
MAX(salary) OVER (PARTITION BY dept_id) AS dept_max
FROM employees;Grup Başına En Büyük N Değerini Yeniden Yazma
Grup başına en üst satırı seçen ilişkili bir alt sorgu (salary = MAX per dept), ROW_NUMBER kullanılarak düzenli biçimde yeniden yazılabilir.
Grupları PARTITION BY ile ayırın, metriğe göre sıralayın ve RANK değeri 1 olanları tutun. En üst sırayı paylaşan tüm satırları istiyorsanız bunun yerine RANK kullanın.
SELECT name, dept_id, salary
FROM (
SELECT name, dept_id, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id
ORDER BY salary DESC) AS rn
FROM employees
) t
WHERE rn = 1;NOT: Yeniden Yazmamanız Gereken Durumlar
Yeniden yazmak her zaman daha iyi sonuç vermez. Şu durumlarda ilişkili alt sorguyu koruyun:
- Dış küme çok küçüktür; bu nedenle satır başına maliyet ihmal edilebilir düzeydedir.
- İlişkili sütun iyi dizinlenmiştir ve sorgu iyileştiricisi onu zaten verimli bir yarı birleşime dönüştürüyordur.
- Bakımı yapılan kodda mikro optimizasyondan çok okunabilirlik önemlidir.
Modern sorgu iyileştiricileri çoğu zaman EXISTS ifadesini otomatik olarak yarı birleşime dönüştürür. Yeniden yazmanın yardımcı olduğunu varsaymadan önce EXPLAIN ile ölçüm yapacağınızı söyleyin.
Eşdeğerliği Doğrulama
Herhangi bir yeniden yazımdan sonra özgün sorguyla aynı satırları ve aynı kardinaliteyi döndürdüğünü doğrulayın.
- Satır sayılarının eşleştiğini denetleyin.
- Birleştirmenin satır çoğalması nedeniyle yinelenen satırlar oluşmadığını denetleyin.
- NULL ve boş grup sınır durumlarının hâlâ doğru davrandığını denetleyin.
Hızlı bir yol şudur: Her iki sürümü çalıştırın ve iki yönde de EXCEPT uygulayın; boş bir sonuç, aynı fikirde oldukları anlamına gelir. Görüşmeciler varsaymak yerine doğrulama yapmanıza değer verir.
SELECT customer_id FROM query_a
EXCEPT
SELECT customer_id FROM query_b;
-- and the reverse; both empty => equivalentIN Yerine JOIN Kullanarak Yeniden Yazma
İlişkisiz bir IN alt sorgusu da çoğu zaman birleştirmeye dönüştürülebilir, ancak aynı satır çoğalması uyarısı burada da geçerlidir. IN üyelikleri tekilleştirir; JOIN bunu yapmaz.
İç listede yinelenen anahtarlar varsa birleştirme dış satırları tekrarlar. IN davranışıyla eşleşmek için iç tarafta veya nihai sonuçta DISTINCT kullanın.
-- IN subquery
SELECT c.name FROM customers c
WHERE c.customer_id IN (SELECT o.customer_id FROM orders o);
-- Join rewrite, de-duplicated to match IN
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id;Hızlı Kontrol
İlişkili NOT EXISTS karşı birleştirmesi için doğru birleştirme yeniden yazımını seçin.
Özet: İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma
Temel çıkarımlar:
EXISTS→INNER JOIN(satır çoğalmasından kaynaklanan yinelenen satırları önlemek için DISTINCT ekleyin).NOT EXISTS→LEFT JOIN ... WHERE key IS NULL(NULL olamayan bir sütunu sınayın).- İlişkili skaler toplulaştırma → gruplandırılmış türetilmiş bir tabloya
JOINuygulayın veya daha iyisi bir pencere işlevi kullanın. - Grup başına en üst satır →
ROW_NUMBER(eşitlikler içinRANK). - Bir yeniden yazımın daha hızlı olduğunu varsaymadan önce eşdeğerliği doğrulayın ve
EXPLAINile denetleyin.
Her iki biçimi ve satır çoğalması tuzağını bilmek, orta seviye görüşmelerin tam olarak ölçtüğü şeydir.
Sıkça Sorulan Sorular
“İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma” dersi ücretsiz mi?
Evet — “İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma” 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.
“İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma” dersinde ne öğreneceğim?
Performans için ilişkili mantığı birleştirmelere veya pencere işlevlerine dönüştürün. 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.
“İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma” 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
- İlişkili Alt Sorgunun Anatomisi
- GROUP BY Olmadan Grup Başına Toplulaştırma
- İlişkili EXISTS ve NOT EXISTS
- İlişkili Alt Sorguları Birleştirme Olarak Yeniden Yazma