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çıklama | Kullanım |
|---|---|---|
| INNER JOIN | Her iki tabloda eşleşenler | En yaygın, sadece eşleşen kayıtlar |
| LEFT JOIN | Sol tablo tamamı + sağdan eşleşenler | Primary tablodaki tüm kayıtlar |
| RIGHT JOIN | Sağ tablo tamamı + soldan eşleşenler | Nadiren kullanılır |
| FULL OUTER JOIN | Her iki tablonun tamamı | Eksik veri analizi |
| CROSS JOIN | Kartezyen çarpım | Tüm kombinasyonlar |
| SELF JOIN | Tablonun kendisiyle birleşimi | Hiyerarş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