SQL Academy · Ders

Kendi Kendine Birleştirmelerin Sınırları

Bunun yerine özyinelemeye ihtiyaç duyduğunuz durumlar.

4. ders / 413 adım

Kendi Kendine Birleştirmelerin Sınırları, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 4. 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.

Öz Birleştirme Nedir

Öz birleştirme, bir tablonun kendisiyle birleştirilmesidir. Tek bir employees tablosunda saklanan çalışanları ve yöneticilerini bulmak gibi, aynı tablodaki satırları karşılaştırmak için kullanışlıdır.

Sınırlarını incelemeden önce, temel bir öz birleştirmenin uygulamada nasıl çalıştığını hatırlayalım.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Tek Seviye Derinlik

Bir öz birleştirme, hiyerarşideki tek bir geçişi zarif bir şekilde ele alır. Her çalışanı doğrudan yöneticisiyle eşleştirmek istiyorsanız, tek bir öz birleştirme yeterlidir.

Verileriniz yalnızca tek seviyeliyse veya yalnızca doğrudan üst-alt ilişkileriyle ilgileniyorsanız bu yaklaşım kusursuz çalışır.

SELECT child.name AS employee, parent.name AS direct_manager
FROM employees child
LEFT JOIN employees parent ON child.manager_id = parent.id;

İki Seviye: İşler Şimdiden Karışıyor

Çalışanlara, yöneticilerine ve yöneticilerinin yöneticilerine ihtiyacınız olursa ne olur? Bir ikinci öz birleştirme eklemeniz gerekir. Sorgu büyür ve okunması zorlaşır.

Hiyerarşinin her ek seviyesi, bir ek birleştirme takma adı ve bir ek JOIN yan tümcesi gerektirir.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

Üç Seviye: Yaklaşım İşe Yaramamaya Başlıyor

Üçüncü bir seviye eklemek, bir birleştirme daha eklemenizi zorunlu kılar. Bu noktada sorgu gereğinden uzun, kırılgan ve bakımı zor bir hâle gelir. Hiyerarşinin derinliği değişirse sorgunun tamamını yeniden yazmanız gerekir.

Bu, öz birleştirmelerin ilk önemli sınırıdır: derinlik arttıkça ölçeklenemezler.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager,
       ggm.name AS great_grand_manager
FROM employees e
LEFT JOIN employees m   ON e.manager_id = m.id
LEFT JOIN employees gm  ON m.manager_id = gm.id
LEFT JOIN employees ggm ON gm.manager_id = ggm.id;

Bilinmeyen Derinlik: Öz Birleştirmeler Yardımcı Olamaz

Gerçek hayattaki organizasyon şemalarında veya kategori ağaçlarında derinlik çoğu zaman sorgu anında bilinmez. Öz birleştirmelerde seviye sayısını önceden sabit kodlamanız gerekir. Hiyerarşi yarın 10 seviye derinliğinde olursa, 3 seviyeli öz birleştirme sorgunuz verileri fark ettirmeden atlar.

Bu, temel bir sınırlamadır: öz birleştirmeler istediğiniz sayıda seviyede ilerleyemez.

-- This only retrieves up to 3 levels deep.
-- Employees deeper than level 3 are simply missing from results.
SELECT e.name, m.name, gm.name
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

Döngüler Öz Birleştirmeleri Tamamen Bozar

Bir başka ciddi sınırlama şudur: Veriler bir döngü içeriyorsa (A, B'yi yönetir; B, C'yi yönetir; C, A'yı yönetir), öz birleştirme sorgusu sonsuz döngüye girmez; ancak döngüyü doğru şekilde algılayıp bildirmez.

Yalın öz birleştirmeleri kullanarak dairesel başvurulara karşı önlem alamazsınız. Özyinelemeli sorgularda, öz birleştirmelerde hiç bulunmayan yerleşik döngü algılama mekanizmaları vardır.

-- Cyclic data: row 3 points back to row 1
-- id | name    | manager_id
--  1 | Alice   | 3   <-- cycle!
--  2 | Bob     | 1
--  3 | Charlie | 2

-- A self join just shows one hop; it cannot detect the loop
SELECT e.name, m.name AS reports_to
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Özyinelemeli CTE'lere Giriş

SQL, derinliği bilinmeyen hiyerarşilerde gezinmek için özel olarak tasarlanmış bir çözüm sunar: özyinelemeli Ortak Tablo İfadesi (CTE). PostgreSQL, MySQL 8+, SQLite ve SQL Server tarafından desteklenen WITH RECURSIVE söz dizimini kullanır.

Özyinelemeli bir CTE iki bölümden oluşur: başlangıç bölümü (başlangıç satırları) ve özyinelemeli bölüm (her ilişkiyi izleyen adım).

WITH RECURSIVE org_tree AS (
  -- Anchor: start with the top-level CEO (no manager)
  SELECT id, name, manager_id, 1 AS depth
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  -- Recursive: find each employee whose manager is already in org_tree
  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 name, depth FROM org_tree ORDER BY depth;

Tam Yolu İzleme

Özyinelemeli CTE'lerin güçlü özelliklerinden biri, aşağı doğru ilerledikçe bağlamı biriktirebilmenizdir. Örneğin, kökten her düğüme kadar olan tam yolu oluşturabilirsiniz; bu, statik bir öz birleştirmeyle tamamen mümkün değildir.

WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id,
         name AS path
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  SELECT e.id, e.name, e.manager_id,
         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;

Öz Birleştirme ve Özyinelemeli CTE: Hangisini Seçmeli

Öz birleştirme kullanın:

  • Hiyerarşinin tam olarak bir veya iki seviyesine ihtiyacınız varsa.
  • Derinlik sabitse ve önceden biliniyorsa.
  • CTE ek yükü olmadan basitlik istiyorsanız.

Özyinelemeli CTE kullanın:

  • Derinlik değişkense veya bilinmiyorsa.
  • Tüm üst düğüm zincirine veya alt düğüm yoluna ihtiyacınız varsa.
  • CYCLE yan tümcesi ya da elle yazılan korumalar aracılığıyla döngü algılamak istiyorsanız.

Performansla İlgili Hususlar

Dizinlenmiş sütunlardaki öz birleştirmeler, sabit derinlikli sorgular için son derece hızlıdır. Her birleştirme tek bir aramadır ve veritabanı iyileştiricisi bunu iyi şekilde yönetir.

Özyinelemeli CTE'ler daha esnektir; ancak derin veya geniş ağaçlarda maliyetli olabilir. Hatalı veriler ya da beklenmeyen döngüler nedeniyle kontrolden çıkan sorguları önlemek için özyinelemeli bölüme her zaman bir derinlik sınırı koruması ekleyin.

WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id, 1 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
  WHERE ot.depth < 10   -- safety guard: stop at depth 10
)
SELECT name, depth FROM org_tree;

Özyineleme Gerektiren Gerçek Hayat Kullanım Alanları

Yaygın birçok veri modeli, öz birleştirmelerin kesinlikle ele alamadığı, istenen sayıda seviyede gezinmeyi gerektirir:

  • Kategori ağaçları — bir e-ticaret kataloğundaki iç içe ürün kategorileri.
  • Malzeme listeleri — parçalardan oluşan bir ürün ve bu parçaların alt parçalardan oluşması.
  • Yorum dizileri — yanıtların yanıtlarına verilen yanıtlar.
  • Dosya sistemi yolları — dizinlerin içindeki dizinler.

Tüm bu durumlarda öz birleştirmeleri art arda eklemek yerine özyinelemeli bir CTE tercih edin.

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

  UNION ALL

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

Bilgi Kontrolü

Öz birleştirmelerin sınırlarını ve bunun yerine ne zaman özyinelemeli CTE kullanacağınızı anlayıp anlamadığınızı sınayın.

Ders Özeti

Bu derste, hiyerarşik verilerde öz birleştirmelerin sınırlarını öğrendiniz:

  • Öz birleştirmeler, hiyerarşinin bir veya iki sabit seviyesinde iyi çalışır.
  • Her ek seviye, başka bir açık JOIN gerektirir; bu da sorguları kırılgan ve bakımı zor hâle getirir.
  • Öz birleştirmeler bilinmeyen derinliği ele alamaz; sabit kodlanan seviyelerin ötesindeki satırlar fark ettirilmeden dışlanır.
  • Verilerdeki döngüsel başvurulara karşı hiçbir koruma sunmazlar.
  • Derinlik değişkense veya bilinmiyorsa bunun yerine özyinelemeli bir CTE (WITH RECURSIVE) kullanın.
  • Kontrolden çıkan çalışmayı önlemek için özyinelemeli sorgulara her zaman bir derinlik koruması ekleyin.

Öz birleştirmeden özyinelemeli CTE'ye ne zaman geçileceğini bilmek, SQL'deki ağaç yapılı verileri sorgulamak için temel bir beceridir.

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

“Kendi Kendine Birleştirmelerin Sınırları” dersi ücretsiz mi?

Evet — “Kendi Kendine Birleştirmelerin Sınırları” 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.

“Kendi Kendine Birleştirmelerin Sınırları” dersinde ne öğreneceğim?

Bunun yerine özyinelemeye ihtiyaç duyduğunuz durumlar. 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 4. dersidir.

“Kendi Kendine Birleştirmelerin Sınırları” 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. Kendi Kendine Birleştirme Nedir
  2. Çalışanlar ve Yöneticiler
  3. Aynı Tablodaki Satırları Karşılaştırma
  4. Kendi Kendine Birleştirmelerin Sınırları
← SQL Academy Sayfasına Dön