0Pricing
SQL Academy · Ders

Özyinelemeli CTE'ler Nasıl Çalışır

Temel durum ve özyinelemeli adım.

Özyinelemeli CTE'ler Nasıl Çalışır, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 1. 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 Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

Özyinelemeli CTE Nedir

Özyinelemeli CTE, kendisine başvuran bir Ortak Tablo İfadesidir. Bir koşul karşılanana kadar bir adımı tekrarlayan sorgular yazmanızı sağlar; bu, döngüye benzer ancak doğrudan SQL olarak ifade edilir.

Özyinelemeli CTE'ler WITH RECURSIVE anahtar sözcüğüyle tanımlanır ve organizasyon şemaları, klasör ağaçları ve malzeme listesi yapıları gibi hiyerarşik veya grafik benzeri verilerde gezinmek için idealdir.

İki Bölümlü Yapı

Her özyinelemeli CTE, UNION ALL ile ayrılmış tam olarak iki bölümden oluşur:

1. Temel durum — başlangıç satırlarını döndüren özyinelemeli olmayan bir SELECT.

2. Özyinelemeli adım — CTE'yi kendisiyle yeniden birleştirerek bir sonraki satır seviyesini üreten bir SELECT.

Motor, yeni satır üretmeyene kadar özyinelemeli adımı çalıştırmaya ve sonuçları biriktirmeye devam eder.

WITH RECURSIVE cte_name AS (
  -- Base case
  SELECT ...
  UNION ALL
  -- Recursive step (references cte_name)
  SELECT ... FROM source JOIN cte_name ON ...
)
SELECT * FROM cte_name;

1'den 5'e Sayma

En basit özyinelemeli CTE sayıları sayar. Temel durum, 1 değerini başlangıç değeri olarak belirler. Özyinelemeli adım, her yinelemede 1 ekler. Özyinelemeli adımın içindeki WHERE yan tümcesi sonlandırma koşulu olarak görev yapar; bu koşul olmadan sorgu sonsuza kadar çalışırdı.

WITH RECURSIVE counter(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;

Adım Adım Çalıştırma

Motorun sayaç CTE'sini yineleme yineleme nasıl işlediği aşağıda açıklanmıştır:

0. yineleme (temel durum): {1} döndürülür.

1. yineleme: özyinelemeli adım {1} üzerinde uygulanır ve {2} döndürülür.

2. yineleme: özyinelemeli adım {2} üzerinde uygulanır ve {3} döndürülür.

3. ve 4. yinelemeler: önce {4}, ardından {5} döndürülür.

5. yineleme: n=5 için WHERE n < 5 yanlış olduğundan sıfır satır döndürülür. Sorgu sona erer.

Biriktirilen tüm satırlar (1, 2, 3, 4, 5) nihai sonucu oluşturur.

Hiyerarşi Tablosu Oluşturma

Özyinelemeli CTE'ler, kendisine başvuran tablolarda özellikle etkilidir. Her çalışanın aynı tabloya geri işaret eden isteğe bağlı bir manager_id değerine sahip olduğu bir employees tablosu oluşturalım.

CREATE TABLE employees (
  id       INTEGER PRIMARY KEY,
  name     VARCHAR(50),
  manager_id INTEGER REFERENCES employees(id)
);

INSERT INTO employees VALUES
  (1, 'Alice',   NULL),
  (2, 'Bob',     1),
  (3, 'Carol',   1),
  (4, 'Dave',    2),
  (5, 'Eve',     2),
  (6, 'Frank',   3);

Hiyerarşide Gezinme

Artık CEO (Alice, id=1) ile başlayan tüm raporlama zincirinde ilerleyebiliriz. Temel durum Alice'i seçer; özyinelemeli adım, manager_id değeri CTE'de zaten bulunan bir kimlikle eşleşen tüm çalışanları bulur.

Sonuç, ağacın derinliği ne olursa olsun Alice'ten ulaşılabilen her çalışanı içerir.

WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id, 0 AS depth
  FROM employees
  WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, e.manager_id, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT depth, name FROM org_tree ORDER BY depth, name;

Yolu İzleme

Yaygın bir geliştirme, kökten her düğüme kadar olan tam zinciri gösteren bir yol metni oluşturmaktır. Daha derine doğru özyinelemeli ilerlerken adları ' -> ' ile ayırarak birleştiririz.

Bu, ekmek kırıntısı tarzı gezinmeyi görüntülemeyi veya derin hiyerarşilerde hata ayıklamayı kolaylaştırır.

WITH RECURSIVE org_tree AS (
  SELECT id, name, name AS path
  FROM employees
  WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, ot.path || ' -> ' || e.name
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT name, path FROM org_tree ORDER BY path;

Özyineleme Derinliğini Sınırlama

Derin veya döngüsel veriler, özyinelemeli bir CTE'nin çok uzun süre çalışmasına neden olabilir. İki güvenli uygulama vardır:

1. Derinliği izleyin ve bir WHERE yan tümcesi ekleyin — WHERE depth < 10, 10 seviyenin ötesine hiç geçmemenizi sağlar.

2. Döngü algılama sütunu kullanın — bazı veritabanları (PostgreSQL 14 ve sonrası), yinelenen düğüm ziyaretlerini otomatik olarak algılamak için CYCLE söz dizimini sunar.

WITH RECURSIVE org_tree AS (
  SELECT id, name, 0 AS depth
  FROM employees
  WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
  WHERE ot.depth < 10
)
SELECT depth, name FROM org_tree;

Özyinelemeli CTE'lerde UNION ve UNION ALL

Özyinelemeli adımda neredeyse her zaman UNION yerine UNION ALL kullanılır. Nedeni şöyledir:

UNION, sonuç kümesinin tamamını karşılaştırarak her yinelemeden sonra satırların yinelenenlerini kaldırır; bu işlem son derece maliyetlidir ve aynı düğüme birden fazla yoldan meşru olarak ulaşılan graflarda anlamı değiştirebilir.

UNION ALL, tüm satırları yinelenenleri kaldırmadan korur; bu da ağaçta gezinme için hem daha hızlı hem de doğrudur. UNION seçeneğini yalnızca yinelenenleri kaldırmaya yönelik özel bir ihtiyacınız varsa ve bunun performans maliyetini anlıyorsanız kullanın.

Tarih Dizisi Oluşturma

Özyinelemeli CTE'ler tarih dizileri oluşturmak için de kullanışlıdır. Bu örnek, belirli bir haftanın her gününü üretir; bu yaklaşım genellikle takvim raporları oluşturmak veya zaman serisi verilerindeki boşlukları doldurmak için kullanılır.

WITH RECURSIVE date_series AS (
  SELECT DATE '2024-01-01' AS day
  UNION ALL
  SELECT day + INTERVAL '1 day'
  FROM date_series
  WHERE day < DATE '2024-01-07'
)
SELECT day FROM date_series;

Bir Yöneticinin Tüm Astlarını Bulma

Temel durumu yalnızca kök düğümle sınırlı kalmadan herhangi bir belirli düğümle başlatabilirsiniz. Burada Bob'dan (id=2) başlayarak ona doğrudan veya dolaylı olarak bağlı herkesi buluyoruz.

Bu yaklaşım izin denetimleri, alt ağaç toplulaştırmaları veya panoları tek bir departmanın kapsamıyla sınırlamak için kullanışlıdır.

WITH RECURSIVE subordinates AS (
  SELECT id, name
  FROM employees
  WHERE id = 2
  UNION ALL
  SELECT e.id, e.name
  FROM employees e
  JOIN subordinates s ON e.manager_id = s.id
)
SELECT name FROM subordinates;

Hızlı Kontrol

Özyinelemeli CTE'lerin nasıl çalıştığını anlayıp anlamadığınızı sınayın.

Ders Özeti

Bu derste özyinelemeli CTE'lerin nasıl çalıştığını öğrendiniz:

Yapı: her özyinelemeli CTE, UNION ALL ile bir özyinelemeli adıma (kendisine başvuran SELECT) birleştirilen bir temel durumdan (başlangıç satırları) oluşur.

Sonlandırma: motor, adım sıfır satır döndürene kadar özyinelemeli adımı tekrarlar ve sonuçları biriktirir.

Yaygın kullanımlar: organizasyon şemalarında ve klasör ağaçlarında gezinmek, sayı veya tarih dizileri oluşturmak, yolları hesaplamak ve bir alt ağaçtaki tüm düğümleri bulmak.

Güvenlik ipuçları: her zaman bir sonlandırma koşulu (derinlik sınırı veya döngü koruması) ekleyin ve performans için UNION yerine UNION ALL kullanmayı tercih edin.

Sıkça Sorulan Sorular

“Özyinelemeli CTE'ler Nasıl Çalışır” dersi ücretsiz mi?

Evet — “Özyinelemeli CTE'ler Nasıl Çalışır” 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 Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“Özyinelemeli CTE'ler Nasıl Çalışır” dersinde ne öğreneceğim?

Temel durum ve özyinelemeli adım. SQL Academy 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 Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, 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 1. dersidir.

“Özyinelemeli CTE'ler Nasıl Çalışır” 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 Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy 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

  1. Özyinelemeli CTE'ler Nasıl Çalışır
  2. Kategori Ağacında İlerleme
  3. Seriler ve Diziler Oluşturma
  4. Sonsuz Döngülerden Kaçınma
← SQL Academy Sayfasına Dön