FULL OUTER JOIN ve MySQL Emülasyonu
Giriş — Her İki Tarafın Tamamı
FULL OUTER JOIN, her iki tablonun tüm satırlarını döndürür. Eşleşme varsa birleştirilir, yoksa diğer tarafın sütunları NULL olur. LEFT JOIN + RIGHT JOIN'in birleşimi gibi düşünebilirsin.
🎯 Analoji: İki farklı okuldaki tüm öğrencilerin listesi. Her iki okulda da kayıtlı olanlar tek satırda birleşir, sadece bir okulda olanlar da listede kalır (diğer okul bilgisi NULL).
FULL OUTER JOIN — Standart SQL
-- PostgreSQL, SQL Server, Oracle'da çalışır
SELECT c.first_name, o.order_id
FROM customers c
FULL OUTER JOIN orders o ON c.customer_id = o.customer_id;
-- Sipariş vermemiş müşteriler: order_id NULL
-- Müşterisi olmayan siparişler: first_name NULL (FK ile imkansız ama teorik)MySQL'de FULL OUTER JOIN Yok!
MySQL, FULL OUTER JOIN'i desteklemez. Ama LEFT JOIN ve RIGHT JOIN'i UNION ile birleştirerek emüle edebilirsin:
-- MySQL'de FULL OUTER JOIN emülasyonu
SELECT c.first_name, c.last_name, o.order_id, o.total_amount
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
UNION
SELECT c.first_name, c.last_name, o.order_id, o.total_amount
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id;Nasıl çalışır:
LEFT JOIN → Tüm müşteriler + eşleşen siparişler
UNION → İki sonucu birleştir (tekrarları eler)
RIGHT JOIN → Tüm siparişler + eşleşen müşteriler
Sol tarafta olmayan sağ satırlar eklenir
UNION ALL kullanırsan tekrarlı satırlar olur — UNION tekrarları eler.
Daha Verimli Emülasyon
-- UNION ALL + sadece eşleşmeyenler (daha performanslı)
SELECT c.first_name, c.last_name, o.order_id, o.total_amount
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
UNION ALL
SELECT c.first_name, c.last_name, o.order_id, o.total_amount
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL; -- Sadece LEFT JOIN'de olmayan satırları eklePratik Kullanım Senaryosu
-- İki farklı tablodaki tüm müşteri e-postaları (web + mobil kayıtlar)
SELECT w.email AS web_email, m.email AS mobile_email
FROM web_registrations w
LEFT JOIN mobile_registrations m ON w.email = m.email
UNION
SELECT w.email, m.email
FROM web_registrations w
RIGHT JOIN mobile_registrations m ON w.email = m.email;
-- Hem web'de hem mobilde, sadece web'de veya sadece mobilde olan e-postalarFULL OUTER JOIN Ne Zaman Gerekir?
Pratikte FULL OUTER JOIN nadiren gerekir. Çoğu durumda LEFT JOIN yeterlidir. FULL OUTER JOIN'in anlamlı olduğu durumlar:
İki bağımsız veri kaynağını karşılaştırma (data reconciliation)
İki farklı sistemdeki kayıtları eşleştirme
Eksik veri tespiti (hangi tarafta eksik?)
Özet
FULL OUTER JOIN her iki tablonun tüm satırlarını döndürür
MySQL desteklemez — LEFT JOIN UNION RIGHT JOIN ile emüle edilir
Pratikte nadiren gerekir — çoğu senaryo LEFT JOIN ile çözülür
Veri reconciliation ve karşılaştırma senaryolarında kullanışlıdır
AI Asistan
Sorularını yanıtlamaya hazır