← Kursa Dön
📄 Text · 25 min

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:

  1. LEFT JOIN → Tüm müşteriler + eşleşen siparişler

  2. UNION → İki sonucu birleştir (tekrarları eler)

  3. RIGHT JOIN → Tüm siparişler + eşleşen müşteriler

  4. 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ı ekle

Pratik 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-postalar

FULL 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