← Kursa Dön
📄 Text · 30 min

CROSS JOIN ve SELF JOIN

CROSS JOIN — Kartezyen Çarpım

CROSS JOIN, iki tablodaki her satırı diğer tablodaki her satırla eşleştirir. Sonuç satır sayısı = sol tablo satır sayısı × sağ tablo satır sayısı.

🎯 Analoji: Bir restoranda 3 ana yemek ve 4 tatlı varsa, CROSS JOIN tüm olası kombinasyonları üretir: 3 × 4 = 12 farklı menü.

-- Basit CROSS JOIN
SELECT c.category_name, p.product_name
FROM categories c
CROSS JOIN products p;
-- 8 kategori × 15 ürün = 120 satır (her kombinasyon)

Ne Zaman Kullanılır?

-- Tüm ürün çiftlerini karşılaştır (bundle önerileri)
SELECT p1.product_name AS product_a, p2.product_name AS product_b
FROM products p1
CROSS JOIN products p2
WHERE p1.product_id < p2.product_id  -- Tekrarı önle (A-B, B-A değil)
  AND p1.category_id != p2.category_id;  -- Farklı kategorilerden

-- Tarih aralığı oluştur (rapor takvimi)
-- numbers tablosu: 0, 1, 2, ..., 30
-- Her güne bir satır
SELECT DATE_ADD('2024-01-01', INTERVAL n.num DAY) AS report_date
FROM (
    SELECT 0 AS num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3
    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
    -- ... 30'a kadar
) AS n;

-- Tüm ay-kategori kombinasyonları (rapor matris yapısı)
SELECT m.month_name, c.category_name
FROM (
    SELECT 'Ocak' AS month_name, 1 AS month_num UNION
    SELECT 'Şubat', 2 UNION SELECT 'Mart', 3
) AS m
CROSS JOIN categories c
ORDER BY m.month_num, c.category_name;

⚠️ Dikkat: CROSS JOIN çok büyük sonuç setleri üretir. 10.000 × 10.000 = 100 milyon satır! Sadece küçük tablolarla veya WHERE koşuluyla sınırlayarak kullan.


SELF JOIN — Tablonun Kendisiyle Birleştirilmesi

SELF JOIN, bir tablonun kendisiyle birleştirilmesidir. Aynı tablo iki farklı alias ile kullanılır.

🎯 Analoji: Bir şirketin organizasyon şemasını düşün. "employees" tablosunda her çalışanın yöneticisi (manager_id) de bir çalışan. Çalışanı yöneticisiyle eşleştirmek için tabloyu kendisiyle JOIN'lersin.

Çalışan-Yönetici İlişkisi

-- Çalışan ve yöneticisi
SELECT 
    e.first_name AS employee,
    e.last_name AS employee_surname,
    m.first_name AS manager,
    m.last_name AS manager_surname
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
-- e = çalışan, m = yönetici (aynı tablo, farklı alias)
-- LEFT JOIN çünkü üst düzey yöneticinin manager_id'si NULL olabilir

Kategori Hiyerarşisi

-- Alt kategori ve üst kategorisi
SELECT 
    child.category_name AS alt_kategori,
    parent.category_name AS ust_kategori
FROM categories child
LEFT JOIN categories parent ON child.parent_category_id = parent.category_id;
+------------------+-----------------+
| alt_kategori     | ust_kategori    |
+------------------+-----------------+
| Elektronik       | NULL            |  ← Ana kategori
| Bilgisayar       | Elektronik      |
| Telefon          | Elektronik      |
| Giyim            | NULL            |  ← Ana kategori
| Erkek Giyim      | Giyim           |
| Kadın Giyim      | Giyim           |
+------------------+-----------------+

Aynı Şehirdeki Müşteri Çiftleri

-- Aynı şehirde yaşayan müşteri çiftleri
SELECT 
    c1.first_name AS customer1,
    c2.first_name AS customer2,
    c1.city
FROM customers c1
INNER JOIN customers c2 
    ON c1.city = c2.city 
    AND c1.customer_id < c2.customer_id;  -- Tekrarı önle

c1.customer_id < c2.customer_id koşulu olmadan:

  • (Ahmet, Ayşe) ve (Ayşe, Ahmet) tekrar olurdu

  • (Ahmet, Ahmet) kendisiyle eşleşirdi


Gerçek Dünya Örneği — Organizasyon Ağacı

-- 3 seviyeli organizasyon ağacı
SELECT 
    CONCAT(e.first_name, ' ', e.last_name) AS calisan,
    COALESCE(CONCAT(m.first_name, ' ', m.last_name), 'CEO') AS yonetici,
    COALESCE(CONCAT(d.first_name, ' ', d.last_name), '-') AS ust_yonetici,
    dept.department_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id
LEFT JOIN employees d ON m.manager_id = d.employee_id
LEFT JOIN departments dept ON e.department_id = dept.department_id
ORDER BY dept.department_name, e.first_name;

Sıkça Yapılan Hatalar

  1. CROSS JOIN'de WHERE unutmak: ON koşusu olmadan tüm kombinasyonlar üretilir. Büyük tablolarda bellek/performans felaketi.

  2. SELF JOIN'de alias kullanmamak: Aynı tablo iki kez kullanılır — farklı alias zorunlu.

  3. Kendi kendine eşleşme: c1.id < c2.id koşulu olmadan satır kendisiyle eşleşir ve çiftler tekrar eder.


Özet

  • CROSS JOIN her satırı diğer tablodaki her satırla eşleştirir (kartezyen çarpım)

  • CROSS JOIN genellikle küçük referans tabloları veya kombinasyon üretimi için kullanılır

  • SELF JOIN tablonun kendisiyle JOIN'lenmesidir — hiyerarşik ilişkiler (yönetici-çalışan, kategori ağacı)

  • SELF JOIN'de farklı alias zorunludur

  • Kendi kendine eşleşme ve tekrar çiftleri önlemek için id < id koşulu ekle