🔴 CTEs
CTEs: CTE'yi bir yemek tarifindeki 'ön hazırlık' bölümü gibi düşün. Kötü yazılmış tarif tek cümledir: 'soğanı doğrayıp kavurduğun karışıma, ayrı bir kapta ezdiğin domatesi ekleye
CTE'yi bir yemek tarifindeki 'ön hazırlık' bölümü gibi düşün. Kötü yazılmış tarif tek cümledir: 'soğanı doğrayıp kavurduğun karışıma, ayrı bir kapta ezdiğin domatesi ekleyerek elde ettiğin sosu makarnaya dök.' İyi tarif ise adımlara böler: 1) sos hazırla, 2) makarnayı haşla, 3) birleştir. `WITH yavas_testler AS (...)` tam olarak o numaralı adımdır — ara sonuca **isim** verir. Peki bu sadece kozmetik bir düzenleme mi; iç içe subquery ile aynı sonucu üretiyorsa neden zahmet edelim? İki gerçek fark var. Birincisi okuma yönü: iç içe subquery **içeriden dışarıya** okunur, insan beyni ise yukarıdan aşağıya okur — üç seviye iç içe geçmiş bir sorguda hangi parantezin kimin olduğunu 6 ay sonra sen bile çıkaramazsın. İkincisi tekrar kullanım: aynı ara sonuca sorgunun iki ayrı yerinde ihtiyaç duyduğunda subquery'yi kopyalayıp yapıştırman gerekir, CTE'yi ise adıyla iki kez çağırırsın. Kopyalanan sorgu, birini güncelleyip diğerini unutunca sessizce yanlış rapor üreten türden bir borçtur. Java'daki karşılığı doğrudan: uzun bir zinciri `var slowTests = ...; var baseline = ...; return compare(slowTests, baseline);` diye ara değişkenlere bölmek. CTE, SQL'in `local variable`'ıdır — ama Java'nın aksine tek bir ifadenin ömrü kadar yaşar, bir sonraki sorguda yoktur. QA raporlamasında bu, 'geçen haftaya göre yavaşlayan testler' gibi çok adımlı soruların tek okunabilir sorguya sığması demektir: CTE1 bu haftanın ortalamaları, CTE2 geçen haftanınki, ana sorgu farkı alır. Bu sorgu bir kez yazılıp nightly pipeline'a konduğunda, performans regresyonunu kimse fark etmeden önce yakalar.
CTE — Common Table Expressions (Ortak Tablo İfadeleri)
Micro Lab: SQL — GROUP BY / CTE / Window
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
Adim Adim: SQL — GROUP BY / CTE / Window
Aggregation mi Window mi?
Aggregation (ozetleme) mi Window (satir bazli hesap) mi? Onu belirle
Aggregation icin GROUP BY ile ozetlenecek sutunu sec
HAVING ile gruplara kosul uygula — WHERE gibi ama agregasyon sonrasinda
WITH cte_adi AS (...) SELECT ... FROM cte_adi ile sorguyu modülerlestir
OVER(PARTITION BY) ekle
Window icin SUM(col) OVER (PARTITION BY bolum ORDER BY siralama) kullan
SQL GROUP BY ve Window Function sorgusu yazma sirasi nedir?
CTE (Common Table Expressions) Yapısı