Ana içeriğe geç
Kesit SQL
Orta · İleri Sorgu Yapıları

CTE: WITH ile okunabilir sorgular

Karmaşık sorguları adım adım, isimli bloklara bölmek.

Uygulamada aç, 9 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Common Table Expression

CTE, sorgunun başında WITH ile tanımlanan, isim verilmiş geçici bir sonuç kümesidir. İç içe alt sorgular yerine yukarıdan aşağı okunan adımlar yazmanı sağlar.

WITH musteri_ciro AS (
  SELECT o.customer_id,
         SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
  FROM orders o
  JOIN order_items oi ON oi.order_id = o.order_id
  WHERE o.status = 'delivered'
  GROUP BY o.customer_id
)
SELECT c.first_name, c.last_name, ROUND(mc.ciro, 2) AS ciro
FROM musteri_ciro mc
JOIN customers c ON c.customer_id = mc.customer_id
ORDER BY mc.ciro DESC
LIMIT 5;

Birden fazla CTE

Virgülle ayrılır; sonraki CTE öncekileri kullanabilir:

WITH aylik AS (
  SELECT strftime('%Y-%m', o.order_date) AS ay,
         SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
  FROM orders o JOIN order_items oi ON oi.order_id = o.order_id
  WHERE o.status = 'delivered'
  GROUP BY ay
),
ortalama AS (
  SELECT AVG(ciro) AS ort FROM aylik
)
SELECT a.ay, ROUND(a.ciro) AS ciro
FROM aylik a, ortalama
WHERE a.ciro > ortalama.ort
ORDER BY a.ay;
Ne zaman CTE?Aynı alt sonucu birden çok kez kullanacaksan, sorgu üç seviyeden fazla iç içe geçiyorsa veya başkası okuyacaksa. Analist ekiplerinde CTE ile yazmak neredeyse standarttır.

Derinleş: CTE ile adım adım doğrulama

CTE'nin en büyük faydası her adımı ayrı ayrı çalıştırabilmendir. Uzun bir sorgu yazarken son SELECT'i geçici olarak SELECT * FROM adim2 LIMIT 10 yap; her adımın çıktısının beklediğin taneciğe sahip olduğunu gör, sonra bir sonraki adıma geç. Bu alışkanlık mülakatta da, iş hayatında da hataların çoğunu erkenden yakalar.

Alıştırmalara geç (9)