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 olabilirKategori 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ı önlec1.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
CROSS JOIN'de WHERE unutmak: ON koşusu olmadan tüm kombinasyonlar üretilir. Büyük tablolarda bellek/performans felaketi.
SELF JOIN'de alias kullanmamak: Aynı tablo iki kez kullanılır — farklı alias zorunlu.
Kendi kendine eşleşme:
c1.id < c2.idkoş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 < idkoşulu ekle
AI Asistan
Sorularını yanıtlamaya hazır