SQL Academy · Ders

Kategori Ağacında İlerleme

Üst-alt ağaçlarını tamamen genişletin.

2. ders / 413 adım

Kategori Ağacında İlerleme, CoddyKit'te ücretsiz bir SQL Academy 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, 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.

Kategori Ağacı Nedir

Gerçek hayattaki birçok veri kümesinde üst-alt ilişkisi bulunur. Bir ürün kataloğunda Elektronik → Telefonlar → Akıllı Telefonlar gibi kategoriler olabilir. Her düğümün bir üst düğümü vardır ve böylece bir ağaç yapısı oluşur.

SQL'de bu yapı genellikle kendisine başvuran bir tablo olarak saklanır: her satırda bir id ve aynı tablodaki başka bir satıra işaret eden bir parent_id bulunur.

CREATE TABLE categories (
  id       INT PRIMARY KEY,
  name     VARCHAR(100) NOT NULL,
  parent_id INT REFERENCES categories(id)
);

Örnek Kategori Verileri

Küçük bir kategori ağacını dolduralım. Kök düğümün üst düğümü olmadığı için parent_id = NULL değerine sahiptir. Diğer tüm düğümler, NULL olmayan bir parent_id değeriyle üst düğümlerine işaret eder.

INSERT INTO categories (id, name, parent_id) VALUES
  (1, 'Electronics',   NULL),
  (2, 'Phones',         1),
  (3, 'Laptops',        1),
  (4, 'Smartphones',    2),
  (5, 'Feature Phones', 2),
  (6, 'Gaming Laptops', 3),
  (7, 'Ultrabooks',     3);

Basit Sorguların Sorunu

Yalın bir SELECT her seferinde yalnızca bir seviyeyi getirebilir. Üç seviye derine ulaşmak için üç ayrı sorguya veya üç öz birleştirmeye ihtiyaç duyarsınız; ağaç büyüdükçe bu yönetilemez hâle gelir.

WITH RECURSIVE, bir sorgunun kendi çıktısına başvurmasını ve yeni satır bulunmayana kadar seviye seviye ilerlemesini sağlayarak bu sorunu çözer.

-- This only shows direct children of Electronics (level 1)
SELECT id, name
FROM   categories
WHERE  parent_id = 1;

WITH RECURSIVE Yapısının Anatomisi

Özyinelemeli bir CTE, UNION ALL ile ayrılan iki bölümden oluşur:

1. Başlangıç üyesi — başlangıç satırlarını sağlayan normal bir SELECT.

2. Özyinelemeli üye — CTE'yi kendisiyle birleştiren ve her yinelemede bir sonraki düzeyi üreten bir SELECT.

Veritabanı motoru, özyinelemeli üye hiç satır döndürmeyene kadar işlemi yineler.

WITH RECURSIVE cte AS (
  -- Anchor: starting rows
  SELECT ...
  UNION ALL
  -- Recursive: join cte to base table
  SELECT ... FROM base_table JOIN cte ON ...
)
SELECT * FROM cte;

Kökten Tüm Ağacı Dolaşma

Kökten başlayın (parent_id IS NULL) ve tüm alt düğümlere doğru ilerleyin. Özyinelemeli üye, biriken her satırı üst-alt ilişkisine göre categories tablosuyla birleştirir.

WITH RECURSIVE category_tree AS (
  -- Anchor: root nodes
  SELECT id, name, parent_id, 1 AS depth
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  -- Recursive: children of current level
  SELECT c.id, c.name, c.parent_id, ct.depth + 1
  FROM   categories      c
  JOIN   category_tree   ct ON ct.id = c.parent_id
)
SELECT id, name, depth
FROM   category_tree
ORDER  BY depth, id;

Yolu İzleme

Kökten her düğüme kadar olan tam yolu kaydetmek yararlıdır. Özyineleme derinleştikçe üst düğümlerin adlarını birleştirerek bir path dizesi oluşturabilirsiniz.

Bu sayede Elektronik / Telefonlar / Akıllı Telefonlar gibi gezinme yollarını kolayca görüntüleyebilirsiniz.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id,
         name AS path
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id,
         ct.path || ' / ' || c.name
  FROM   categories    c
  JOIN   category_tree ct ON ct.id = c.parent_id
)
SELECT id, name, path
FROM   category_tree
ORDER  BY path;

Belirli Bir Düğümden Başlama

Kökten başlamak zorunda değilsiniz. Başlangıç satırının WHERE yan tümcesini değiştirerek herhangi bir düğümün alt ağacını dolaşabilirsiniz. Burada Telefonlar düğümünden (id = 2) başlayıp tüm alt düğümleri alıyoruz.

WITH RECURSIVE subtree AS (
  SELECT id, name, parent_id, 0 AS depth
  FROM   categories
  WHERE  id = 2          -- start at Phones

  UNION ALL

  SELECT c.id, c.name, c.parent_id, s.depth + 1
  FROM   categories c
  JOIN   subtree    s ON s.id = c.parent_id
)
SELECT id, name, depth
FROM   subtree
ORDER  BY depth, id;

Yukarı Doğru İlerleme: Tüm Üst Düğümleri Bulma

Ağaç ters yönde de dolaşılabilir — bir yaprak düğümden köke doğru. Aşağı doğru ilerlemek yerine parent_id değerini yukarı doğru izleyecek şekilde birleştirmeyi tersine çevirmeniz yeterlidir. Bu, bilinen bir yaprak düğüm için tam gezinme yoluna ihtiyaç duyduğunuzda yararlıdır.

WITH RECURSIVE ancestors AS (
  SELECT id, name, parent_id
  FROM   categories
  WHERE  id = 4          -- start at Smartphones

  UNION ALL

  SELECT c.id, c.name, c.parent_id
  FROM   categories c
  JOIN   ancestors  a ON a.parent_id = c.id
)
SELECT id, name
FROM   ancestors
ORDER  BY id;

Girintili Görünüm Ekleme

Yaygın bir kullanıcı arayüzü kalıbı, alt düğümlere görsel olarak girinti vermektir. Her adın önüne boşluklar ekleyerek metin tabanlı bir ağaç görünümü oluşturmak için REPEAT (veya LPAD) ile depth sütununu birlikte kullanabilirsiniz.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id, 0 AS depth
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id, ct.depth + 1
  FROM   categories    c
  JOIN   category_tree ct ON ct.id = c.parent_id
)
SELECT
  REPEAT('    ', depth) || name AS indented_name,
  depth
FROM   category_tree
ORDER  BY path;

Sonsuz Döngülere Karşı Koruma

Verileriniz bir döngü içeriyorsa (A, B'nin üstü; B de A'nın üstü ise) özyineleme sonsuza kadar sürer ve çöker. Ziyaret edilen ID'leri bir dizi içinde izleyip geçerli ID zaten mevcutsa işlemi durdurarak buna karşı koruma sağlayabilirsiniz.

WITH RECURSIVE safe_tree AS (
  SELECT id, name, parent_id,
         ARRAY[id] AS visited
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id,
         st.visited || c.id
  FROM   categories c
  JOIN   safe_tree  st ON st.id = c.parent_id
  WHERE  c.id <> ALL(st.visited)   -- stop if already seen
)
SELECT id, name FROM safe_tree;

Düğüm Başına Alt Düğüm Sayısını Hesaplama

Tam ağacı elde ettikten sonra verileri toplulaştırabilirsiniz. Burada her düğümün kaç alt düğümü olduğunu, alt düğümlere ait satırları üst düğüm listesiyle yeniden gruplayarak sayıyoruz. Bu, gezinme menüsünde kategori adlarının yanında öğe sayılarını göstermek için yararlıdır.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id, id AS root_id
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id, ct.root_id
  FROM   categories    c
  JOIN   category_tree ct ON ct.id = c.parent_id
)
SELECT
  root_id,
  COUNT(*) - 1 AS descendant_count
FROM   category_tree
GROUP  BY root_id
ORDER  BY root_id;

Hızlı Kontrol

Özyinelemeli kategori ağacı sorgularını ne kadar anladığınızı sınayın.

Ders Özeti

Bu derste, kendisine başvuran bir kategori tablosunu WITH RECURSIVE kullanarak nasıl dolaşacağınızı öğrendiniz.

Önemli noktalar:

- Başlangıç üyesi, başlangıç düğümlerini (genellikle kökü) seçer.

- Özyinelemeli üye, bir sonraki düzeyi bulmak için CTE'yi temel tabloyla birleştirir.

- Her düğümün kaç düzey derinde olduğunu izlemek için bir depth sütunu ekleyin.

- Gezinme yolları oluşturmak için bir path dizesi oluşturun.

- Tüm üst düğümleri bulmak için parent_id değerini ters yönde izleyerek yukarı doğru ilerleyin.

- Kirli verilerdeki döngülere karşı korunmak için bir visited dizisi kullanın.

Başlamak ücretsiz

Yapay zeka eğitmeniyle SQL öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
46
Dersler
183

Sıkça Sorulan Sorular

“Kategori Ağacında İlerleme” dersi ücretsiz mi?

Evet — “Kategori Ağacında İlerleme” 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.

“Kategori Ağacında İlerleme” dersinde ne öğreneceğim?

Üst-alt ağaçlarını tamamen genişletin. 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 2. dersidir.

“Kategori Ağacında İlerleme” 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