Birden Çok CTE'yi Zincirleme
Birbirine başvuran adlandırılmış adımlardan oluşan bir işlem hattı oluşturun.
Birden Çok CTE'yi Zincirleme, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 2. 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, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.
CTE'ler Neden Birbirine Bağlanır
Gerçek mülakat soruları nadiren tek adıma sığar. CTE'leri birbirine bağlamak, her aşamanın önceki aşamanın çıktısını dönüştürdüğü adlandırılmış aşamalardan oluşan bir işlem hattı kurmanızı sağlar. Bu yaklaşım, kıdemli bir mühendisin zor bir sorguyu yönetilebilir parçalara ayırma biçimini yansıtır.
Alt sorguları üç düzey boyunca iç içe yerleştirmek yerine her adımı bir kez yazar, ona bir ad verir ve sonraki adımların bu adı kullanmasını sağlarsınız.
Virgülle Ayrılan Sözdizimi
Birden çok CTE tanımlamak için WITH ifadesini bir kez yazıp her adlandırılmış bloğu virgülle ayırırsınız. WITH anahtar sözcüğünü tekrarlamazsınız.
- En üstte bir
WITH. - Her CTE tanımı arasında bir virgül.
- Son ana sorgudan önce virgül yok.
WITH a AS (
SELECT customer_id FROM orders
),
b AS (
SELECT customer_id FROM a
)
SELECT *
FROM b;Sonraki CTE'ler Öncekilere Başvurabilir
Birbirine bağlamanın gücü şuradadır: Bir CTE, kendisinden önce tanımlanmış herhangi bir CTE'den veri okuyabilir. Yalnızca ileriye doğru olan bu görünürlük, bir bağımlılık zinciri kurmanızı sağlar.
Önceki bir CTE sonraki bir CTE'yi göremez; bu nedenle sıra önemlidir. Aşamalarınızı ham veriden son yapıya doğru düzenleyin.
WITH filtered AS (
SELECT *
FROM events
WHERE event_type = 'purchase'
),
per_user AS (
SELECT user_id, COUNT(*) AS purchases
FROM filtered
GROUP BY user_id
)
SELECT *
FROM per_user;Uygulamalı Örnek: Üç Aşamalı İşlem Hattı
Soru: 1000 dolardan fazla harcayan müşterilerin ortalama harcaması nedir? Bunu üç aşamaya ayırın: müşteri başına toplam harcamayı hesaplayın, çok harcayanları filtreleyin, ardından bunların ortalamasını alın.
Her CTE adı amacını belgelediği için, inceleyen kişi akışı hemen anlar.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
),
big_spenders AS (
SELECT customer_id, total
FROM spend
WHERE total > 1000
)
SELECT AVG(total) AS avg_big_spend
FROM big_spenders;Tanım Sırası Önemlidir
Görünürlük yalnızca ileriye doğru olduğu için, başka bir CTE'ye bağlı olan CTE, bağımlılığından sonra listelenmelidir. Henüz tanımlanmamış bir ada başvurursanız veritabanı 'ilişki mevcut değil' hatası verir.
İyi bir alışkanlık olarak CTE listenizi yukarıdan aşağıya okuyun ve kullanılan her adın daha önce yukarıda yer aldığını doğrulayın.
Bir CTE'ye Birden Çok CTE'den Başvurma
Tek bir CTE, kendisinden sonra gelen birkaç CTE'ye veri sağlayabilir. İç içe alt sorgulara kıyasla birbirine bağlamanın üstünlüğü burada ortaya çıkar: temel bir sonucu bir kez hesaplar ve ondan dallanırsınız.
Burada hem active hem de recent, base içinden veri okuyarak yinelenen mantığı önler.
WITH base AS (
SELECT * FROM users WHERE deleted = false
),
active AS (
SELECT id FROM base WHERE last_login > NOW() - INTERVAL '7 days'
),
recent AS (
SELECT id FROM base WHERE created_at > NOW() - INTERVAL '30 days'
)
SELECT (SELECT COUNT(*) FROM active) AS active_cnt,
(SELECT COUNT(*) FROM recent) AS recent_cnt;İki CTE'yi Birbirine Birleştirme
Birbirine bağlanmış CTE'ler ana sorguda sıklıkla birleştirilir. Her iki tarafı ayrı ayrı hesaplayıp sonra birleştirin. Böylece her hesaplama yalıtılmış, birleştirme ise basit kalır.
Aşağıda sipariş sayılarını ve iade sayılarını bağımsız olarak hesaplayıp müşteri başına birleştiriyoruz.
WITH orders_cte AS (
SELECT customer_id, COUNT(*) AS orders
FROM orders GROUP BY customer_id
),
refunds_cte AS (
SELECT customer_id, COUNT(*) AS refunds
FROM refunds GROUP BY customer_id
)
SELECT o.customer_id, o.orders, COALESCE(r.refunds, 0) AS refunds
FROM orders_cte o
LEFT JOIN refunds_cte r ON r.customer_id = o.customer_id;İç İçe Yerleştirmek Yerine Okunabilirlik
Üç düzeyde iç içe yerleştirilmiş bir alt sorguyu, üç CTE'den oluşan bir işlem hattıyla karşılaştırın. İç içe sürüm, okuyucuyu sorguyu içeriden dışarıya doğru zihninde açmaya zorlar. CTE sürümü ise yürütme sırasına göre, yukarıdan aşağıya okunur.
Mülakat yapanlar CTE yaklaşımını olumlu değerlendirir; çünkü üretimde sürdürülebilir kılmak isteyecekleri yaklaşım budur. Her aşamayı adlandırmak, güncelliğini yitirmeyen bir belgelendirmedir.
Yaygın Bir Birbirine Bağlama Hatası
Yeni başlayanlar çoğu zaman son CTE'den sonra, ana SELECT'in hemen öncesine bir virgül ekler. Sondaki bu virgül bir sözdizimi hatasıdır.
- Virgüller yalnızca CTE tanımlarının arasında bulunur.
- Son kapanış parantezinin ardından doğrudan ana sorgu gelir; virgül gelmez.
Bir başka tuzak da her CTE'nin parantez içinde kendine ait tam bir SELECT içermesi gerektiğini unutmaktır.
Her Aşama Ayrı Ayrı mı Çalışır
İnce bir mülakat noktası şudur: Mantıksal olarak işlem hattı ayrı adımlar şeklinde okunur; ancak sorgu iyileştirici bunları tek bir yürütme planında satır içine alıp birleştirebilir. Çoğu veritabanı motorunda ara sonuçları fiziksel olarak depolamanın maliyetini ödemek zorunda kalmazsınız.
Dolayısıyla birbirine bağlamak, performansa mutlaka bir maliyet getirmeden sorguyu sizin için daha anlaşılır hale getirir. Derinlemesine bilgi sahibi olduğunuzu göstermek için bundan söz edin.
Aşamaları İşlem Hattı Mantığıyla Adlandırma
İyi aşama adları, sorguyu kendini açıklayan bir koda dönüştürür. İşlemi değil, her adımın çıktısını açıklayan adları tercih edin.
spendvebig_spenders,step1vestep2adlarından daha iyidir.- Okuyucu, yalnızca CTE adlarına bakarak tüm akışı çıkarabilmelidir.
- Aşamalar boyunca tutarlı adlandırma, ana sorgudaki birleştirmeyi belirgin hale getirir.
Bir mülakatta aşamaları açıkça adlandırmanız, bakımı kolay üretim SQL'i yazdığınızı gösterir.
Hızlı Kontrol
Birbirine bağlanmış CTE'lerin birbirlerine nasıl başvurduğunu ne kadar kavradığınızı kontrol edin.
Özet: CTE'leri Birbirine Bağlama
İşlem hatları kurmayı öğrendiniz: tek bir WITH, virgülle ayrılmış CTE tanımları ve her aşamanın önceki aşamalardan okuyabildiği yalnızca ileriye doğru görünürlük.
- CTE'leri ham veriden sonuca doğru sıralayın.
- Bir temel CTE'yi kendisinden sonra gelen birkaç adımda yeniden kullanın.
- Ana sorgudan önce sondaki virgülü kullanmayın.
- Birbirine bağlamak, performansı mutlaka düşürmeden okunabilirliği artırır.
Sırada: CTE'leri alt sorgular ve geçici tablolarla karşılaştırmak var.
Sıkça Sorulan Sorular
“Birden Çok CTE'yi Zincirleme” dersi ücretsiz mi?
Evet — “Birden Çok CTE'yi Zincirleme” 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 Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.
“Birden Çok CTE'yi Zincirleme” dersinde ne öğreneceğim?
Birbirine başvuran adlandırılmış adımlardan oluşan bir işlem hattı oluşturun. Coding 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.
Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Coding 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 2. dersidir.
“Birden Çok CTE'yi Zincirleme” 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 Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Coding 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
- İlk CTE'nizi Yazma
- Birden Çok CTE'yi Zincirleme
- CTE, Alt Sorgu ve Geçici Tablo Karşılaştırması
- İç İçe Sorguları CTE'lere Dönüştürme