SQL JOIN Nedir? INNER, LEFT, RIGHT ve FULL JOIN Örnekleri
JOIN, ilişkili tablolardaki satırları ortak alanlar üzerinden birleştirmek için kullanılır. Bir müşteri tablosundaki isimleri sipariş tablosundaki tutarlarla aynı sonuçta göstermek JOIN’in en temel örneğidir.
Örnek tablolar
Customers:
| CustomerID | CustomerName |
|---|---|
| 1 | Ada |
| 2 | Mert |
| 3 | Deniz |
Orders:
| OrderID | CustomerID | Amount |
|---|---|---|
| 101 | 1 | 500 |
| 102 | 1 | 250 |
| 103 | 2 | 900 |
| 104 | 4 | 300 |
Ortak alan CustomerID’dir.
INNER JOIN
Yalnızca iki tabloda da eşleşen kayıtları getirir:
SELECT
c.CustomerName,
o.OrderID,
o.Amount
FROM Customers c
INNER JOIN Orders o
ON c.CustomerID = o.CustomerID;
Ada’nın iki, Mert’in bir siparişi gelir. Siparişi olmayan Deniz ve müşteri tablosunda bulunmayan 4 numaralı kayıt sonuçta yer almaz.
LEFT JOIN
Sol tablodaki tüm kayıtları, sağ tablodan eşleşenleri getirir:
SELECT
c.CustomerName,
o.OrderID,
o.Amount
FROM Customers c
LEFT JOIN Orders o
ON c.CustomerID = o.CustomerID;
Deniz de sonuçta görünür; sipariş alanları NULL olur.
Siparişi olmayan müşterileri bulmak için:
SELECT c.CustomerID, c.CustomerName
FROM Customers c
LEFT JOIN Orders o
ON c.CustomerID = o.CustomerID
WHERE o.OrderID IS NULL;
RIGHT JOIN
Sağ tablodaki tüm kayıtları korur:
SELECT
c.CustomerName,
o.OrderID,
o.Amount
FROM Customers c
RIGHT JOIN Orders o
ON c.CustomerID = o.CustomerID;
4 numaralı müşteriye ait sipariş sonuçta bulunur; müşteri adı NULL olur. Aynı sonuç çoğu zaman tablo sırası değiştirilmiş LEFT JOIN ile daha okunabilir kurulabilir.
FULL OUTER JOIN
Her iki tablodaki tüm kayıtları getirir:
SELECT
c.CustomerName,
o.OrderID,
o.Amount
FROM Customers c
FULL OUTER JOIN Orders o
ON c.CustomerID = o.CustomerID;
Hem siparişi olmayan Deniz hem de müşteri kaydı bulunmayan 4 numaralı sipariş görünür.
JOIN türleri karşılaştırması
| JOIN | Sol eşleşmeyen | Sağ eşleşmeyen | Eşleşen |
|---|---|---|---|
| INNER | Getirmez | Getirmez | Getirir |
| LEFT | Getirir | Getirmez | Getirir |
| RIGHT | Getirmez | Getirir | Getirir |
| FULL OUTER | Getirir | Getirir | Getirir |
ON ve WHERE farkı
LEFT JOIN kullanırken sağ tablo filtresini WHERE bölümüne yazmak sonucu farkında olmadan INNER JOIN’e çevirebilir.
-- Siparişi olmayan müşterileri eler
SELECT c.CustomerName, o.Amount
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.Amount > 100;
Sol tablodaki tüm müşterilerin korunması isteniyorsa koşul JOIN içine alınabilir:
SELECT c.CustomerName, o.Amount
FROM Customers c
LEFT JOIN Orders o
ON c.CustomerID = o.CustomerID
AND o.Amount > 100;
Satırlar neden çoğalır?
Bir müşterinin birden fazla siparişi varsa müşteri satırı her sipariş için tekrar eder. Bu hata değil, ilişkinin bire-çok olmasının sonucudur.
Toplamların şişmesini önlemek için:
- Tabloların grain seviyesini belirleyin.
- JOIN anahtarının gerçekten tekil olup olmadığını kontrol edin.
- Gerekirse sağ tabloyu önce gruplayın.
DISTINCTile problemi gizlemek yerine çoğalmanın nedenini bulun.
SAP satınalma örneğini EKKO ve EKPO SQL JOIN rehberinde görebilirsiniz.
CROSS JOIN ve SELF JOIN
CROSS JOIN, iki tablonun tüm kombinasyonlarını üretir. SELF JOIN ise bir tabloyu kendisiyle birleştirme yaklaşımıdır; çalışan-yönetici ilişkisi buna örnektir.
SQL JOIN pratiği
JOIN sorgularını ücretsiz interaktif SQL eğitiminde tarayıcı üzerinden çalıştırabilirsiniz.
Sık sorulan sorular
En çok hangi JOIN kullanılır?
INNER JOIN ve LEFT JOIN veri analizi çalışmalarında en sık karşılaşılan türlerdir.
JOIN için kolon adları aynı olmak zorunda mı?
Hayır. Veri tipleri ve anlamları uyumlu olduğu sürece farklı isimli alanlar ON koşulunda eşleştirilebilir.
NULL değerler eşleşir mi?
Standart eşitlik karşılaştırmasında NULL, NULL’a eşit kabul edilmez. NULL davranışı ayrıca ele alınmalıdır.