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:

CustomerIDCustomerName
1Ada
2Mert
3Deniz

Orders:

OrderIDCustomerIDAmount
1011500
1021250
1032900
1044300

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ı

JOINSol eşleşmeyenSağ eşleşmeyenEşleşen
INNERGetirmezGetirmezGetirir
LEFTGetirirGetirmezGetirir
RIGHTGetirmezGetirirGetirir
FULL OUTERGetirirGetirirGetirir

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.
  • DISTINCT ile 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.

Ali Rıza Ekici

İş Zekâsı, Qlik Sense, ETL, SAP, SQL ve veri analitiği üzerine uygulamalı içerikler hazırlıyor.

Yazar ve deneyim hakkında →