JOIN İşlemleri

Tabloları birleştirme: INNER, LEFT, RIGHT, FULL OUTER, CROSS, SELF JOIN

JOIN Nedir?

JOIN, birden fazla tabloyu ortak bir kolon üzerinden birleştirmek için kullanılır. İlişkisel veritabanlarının temelidir.

JOIN Türleri

JOIN TürüAçıklamaKullanım
INNER JOINHer iki tabloda eşleşenlerEn yaygın, sadece eşleşen kayıtlar
LEFT JOINSol tablo tamamı + sağdan eşleşenlerPrimary tablodaki tüm kayıtlar
RIGHT JOINSağ tablo tamamı + soldan eşleşenlerNadiren kullanılır
FULL OUTER JOINHer iki tablonun tamamıEksik veri analizi
CROSS JOINKartezyen çarpımTüm kombinasyonlar
SELF JOINTablonun kendisiyle birleşimiHiyerarşik veriler

INNER JOIN

Sadece her iki tabloda eşleşen kayıtları getirir.

SELECT 
    u.id AS user_id,
    u.username,
    u.email,
    o.id AS order_id,
    o.total_amount,
    o.status
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
user_id | username | email | order_id | total_amount | status ---------+----------+--------------------+----------+--------------+--------- 1 | ahmet | ahmet@example.com | 101 | 250.00 | shipped 1 | ahmet | ahmet@example.com | 102 | 180.00 | pending 3 | veli | veli@example.com | 103 | 75.50 | delivered

LEFT JOIN (LEFT OUTER JOIN)

Sol tablodaki TÜM kayıtları getirir. Eşleşme yoksa NULL döner.

-- Hiç sipariş vermemiş kullanıcılar dahil tüm kullanıcılar
SELECT 
    u.username,
    COUNT(o.id) AS order_count,
    COALESCE(SUM(o.total_amount), 0) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.username
ORDER BY total_spent DESC;
username | order_count | total_spent ----------+-------------+------------- ahmet | 5 | 1250.00 mehmet | 2 | 430.00 ali | 0 | 0.00 ← Hiç sipariş yok

RIGHT JOIN

-- Tüm kategoriler ve ürünleri (ürünü olmayan kategoriler dahil)
SELECT 
    c.name AS category_name,
    p.name AS product_name,
    p.price
FROM products p
RIGHT JOIN categories c ON p.category_id = c.id;

FULL OUTER JOIN

-- Eşleşmeyen kayıtları bulmak için
SELECT 
    c.name AS customer_name,
    o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON c.id = o.customer_id
WHERE c.id IS NULL OR o.id IS NULL;

Çoklu JOIN

SELECT 
    u.username,
    o.id AS order_id,
    o.total_amount,
    p.name AS product_name,
    oi.quantity,
    oi.unit_price,
    c.name AS category_name
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
INNER JOIN categories c ON p.category_id = c.id
WHERE o.status = 'completed'
ORDER BY o.created_at DESC;

SELF JOIN

Tablonun kendisiyle birleşimi. Hiyerarşik veriler için kullanılır.

-- Çalışan ve yöneticisi
SELECT 
    e.name AS employee,
    e.title,
    m.name AS manager,
    m.title AS manager_title
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY m.name, e.name;

-- Aynı şehirdeki müşteri çiftleri
SELECT 
    a.name AS customer1,
    b.name AS customer2,
    a.city
FROM customers a
INNER JOIN customers b ON a.city = b.city AND a.id < b.id;

JOIN Performans İpuçları

  • JOIN kolonlarında index olduğundan emin olun
  • JOIN sırası önemlidir, küçük tabloyu önce yazın
  • Gereksiz kolonları SELECT etmeyin
  • WHERE koşullarını JOIN sonrasına değil, mümkünse JOIN içine yazın