Kategori Ağacında İlerleme
Üst-alt ağaçlarını tamamen genişletin.
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.
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
- Özyinelemeli CTE'ler Nasıl Çalışır
- Kategori Ağacında İlerleme
- Seriler ve Diziler Oluşturma
- Sonsuz Döngülerden Kaçınma