SQL JOIN Nasıl Kullanılır? INNER ve LEFT JOIN Örnekleri


0

SQL JOIN nasıl kullanılır sorusuna kısa yanıt: tabloları ON koşuluyla birleştirin. INNER ve LEFT JOIN örneklerini adım adım inceleyin.

Önemli not: Örnekler Microsoft SQL Server T-SQL içindir. JOIN koşulunun yanlış kurulması satır sayısını artırabilir veya kayıtları dışarıda bırakabilir.

SQL JOIN nasıl kullanılır sorusunun kısa yanıtı şudur: İki tabloyu FROM ve JOIN anahtar sözcükleriyle birleştirir, eşleşme kuralını ON koşulunda belirtirsiniz. INNER JOIN yalnızca eşleşen satırları döndürür. LEFT JOIN ise sol tablonun tüm satırlarını korur, eşleşmeyen sağ kolonlara NULL yazar. Bu rehberdeki tüm örnekler Microsoft SQL Server T-SQL içindir. Örnek kimlikler ve kurgusal veriler kullanılmıştır; üretim verisine karşı çalıştırmadan önce mutlaka test ortamında deneyin.

Ön koşullar ve güvenli çalışma ortamı

Aşağıdaki adımlara başlamadan önce erişiminizi ve ortamınızı doğrulayın. JOIN sorguları veri değiştirmez; yine de alıştırma tablolarını ayrı bir veritabanında oluşturmanız önerilir.

  • SQL Server Management Studio (SSMS) veya Azure Data Studio gibi bir istemci.
  • Test amaçlı bir veritabanında tablo oluşturma ve SELECT çalıştırma yetkisi.
  • Üretim verisine dokunmadan önce yedek veya kopya üzerinde çalışma alışkanlığı.
  • Sorgu sonuçlarını satır sayısıyla birlikte kontrol etme disiplini.

İlişkili iki örnek tablo oluşturma

JOIN mantığını görmek için iki küçük tablo yeterlidir. Musteriler tablosu müşterileri, Siparisler tablosu ise siparişleri tutar. Siparisler tablosundaki MusteriID kolonu Musteriler tablosuna başvurur. Aşağıdaki betik yalnızca örnek veri oluşturur; mevcut tablolarınızı etkilemez.

Örnek tablolar ve veriler

CREATE TABLE dbo.Musteriler (
    MusteriID   INT          NOT NULL PRIMARY KEY,
    Ad          NVARCHAR(50) NOT NULL,
    Sehir       NVARCHAR(50) NULL
);

CREATE TABLE dbo.Siparisler (
    SiparisID   INT           NOT NULL PRIMARY KEY,
    MusteriID   INT           NULL,
    Tutar       DECIMAL(10,2) NOT NULL
);

INSERT INTO dbo.Musteriler (MusteriID, Ad, Sehir) VALUES
    (1, N'Ayşe', N'Ankara'),
    (2, N'Mehmet', N'İzmir'),
    (3, N'Zeynep', N'Bursa'),
    (4, N'Can', N'Ankara');

INSERT INTO dbo.Siparisler (SiparisID, MusteriID, Tutar) VALUES
    (101, 1, 250.00),
    (102, 1, 400.00),
    (103, 2, 150.00),
    (104, NULL, 90.00);

Bu veride Zeynep ve Can müşterilerinin siparişi yoktur. Ayrıca 104 numaralı siparişin MusteriID değeri NULL'dur. Bu iki durum, INNER ve LEFT JOIN arasındaki farkı göstermek için bilinçli olarak eklenmiştir.

INNER JOIN ile eşleşen kayıtları getirme

INNER JOIN, yalnızca ON koşulunu sağlayan satırları döndürür. Aşağıdaki sorgu, siparişi olan müşterileri ve sipariş tutarlarını listeler. Siparişi olmayan müşteriler ve müşterisi bilinmeyen sipariş sonuçta görünmez.

INNER JOIN örneği

SELECT
    m.MusteriID,
    m.Ad,
    s.SiparisID,
    s.Tutar
FROM dbo.Musteriler AS m
INNER JOIN dbo.Siparisler AS s
    ON s.MusteriID = m.MusteriID
ORDER BY m.MusteriID, s.SiparisID;

Beklenen sonuç üç satırdır: Ayşe için iki sipariş, Mehmet için bir sipariş. Zeynep ve Can sonuçta yoktur. 104 numaralı sipariş de eşleşen müşterisi olmadığı için listelenmez. Tablo takma adları (m ve s) kolon adlarını kısaltır ve okunabilirliği artırır.

LEFT JOIN ile eşleşmeyen kayıtları görme

LEFT JOIN, sol tablodaki tüm satırları korur. Sağ tabloda eşleşme yoksa sağ kolonlar NULL olarak gelir. Siparişi olmayan müşterileri bulmak için bu davranıştan yararlanırsınız.

LEFT JOIN örneği

SELECT
    m.MusteriID,
    m.Ad,
    s.SiparisID,
    s.Tutar
FROM dbo.Musteriler AS m
LEFT JOIN dbo.Siparisler AS s
    ON s.MusteriID = m.MusteriID
ORDER BY m.MusteriID, s.SiparisID;

Sonuçta dört müşteri de yer alır. Zeynep ve Can için SiparisID ve Tutar kolonları NULL görünür. Yalnızca siparişi olmayanları listelemek isterseniz WHERE s.SiparisID IS NULL koşulunu ekleyin. Bu kalıp, LEFT JOIN ile eşleşmeyen kayıtları bulmanın standart yoludur.

ON koşulu ile WHERE koşulunun farkı

LEFT JOIN'de ON ve WHERE farklı davranır. ON koşulu eşleştirme kuralını tanımlar; WHERE ise birleştirme sonrası satırları filtreler. Sağ tabloya ait bir koşulu WHERE'e yazarsanız NULL satırlar elenir ve sorgu INNER JOIN gibi davranır. Aşağıdaki iki sorgu bu farkı gösterir.

ON ve WHERE karşılaştırması

-- Sağ tablo koşulu ON içinde: tüm müşteriler korunur
SELECT m.MusteriID, m.Ad, s.SiparisID, s.Tutar
FROM dbo.Musteriler AS m
LEFT JOIN dbo.Siparisler AS s
    ON s.MusteriID = m.MusteriID
   AND s.Tutar > 200
ORDER BY m.MusteriID;

-- Aynı koşul WHERE içinde: eşleşmeyen satırlar elenir
SELECT m.MusteriID, m.Ad, s.SiparisID, s.Tutar
FROM dbo.Musteriler AS m
LEFT JOIN dbo.Siparisler AS s
    ON s.MusteriID = m.MusteriID
WHERE s.Tutar > 200
ORDER BY m.MusteriID;

İlk sorguda siparişi olmayan müşteriler NULL tutarlarla görünür. İkinci sorguda ise yalnızca 200'ün üzerinde tutarı olan eşleşmeler kalır. Kural olarak sağ tabloya ait filtreleri ON içine, sol tabloya ait filtreleri WHERE içine yazmak niyetinizi daha net yansıtır.

Birden çok tabloyu birleştirme

JOIN zinciri soldan sağa okunur. Her yeni JOIN, o ana kadarki sonuç kümesine eklenir. Aşağıdaki örnek, siparişlere bir Urunler tablosu ekleyerek üç tabloyu birleştirir. Önce tabloyu oluşturun, sonra sorguyu çalıştırın.

Üç tablolu JOIN

CREATE TABLE dbo.Urunler (
    UrunID    INT           NOT NULL PRIMARY KEY,
    UrunAd    NVARCHAR(50)  NOT NULL,
    BirimFiyat DECIMAL(10,2) NOT NULL
);

INSERT INTO dbo.Urunler (UrunID, UrunAd, BirimFiyat) VALUES
    (1, N'Kalem', 25.00),
    (2, N'Defter', 60.00);

SELECT
    m.Ad,
    s.SiparisID,
    u.UrunAd,
    u.BirimFiyat
FROM dbo.Musteriler AS m
INNER JOIN dbo.Siparisler AS s
    ON s.MusteriID = m.MusteriID
INNER JOIN dbo.Urunler AS u
    ON u.UrunID = s.SiparisID
ORDER BY s.SiparisID;

Bu örnekte UrunID ile SiparisID eşleştirmesi yalnızca gösterim amaçlıdır; gerçek şemada sipariş kalemleri ayrı bir tabloda tutulur. Önemli olan, her JOIN'in kendi ON koşulunu taşımasıdır. Koşulları eksik bırakmak çapraz birleştirmeye yol açar ve satır sayısını beklenmedik biçimde büyütür.

Tekrarlanan satırları teşhis etme

JOIN sonrası satır sayısı beklediğinizden fazlaysa önce kaynak tabloların anahtar yapısını kontrol edin. Sağ tabloda aynı anahtara birden çok satır düşüyorsa sol satırlar çoğalır. Aşağıdaki sorgu, her müşteri için eşleşen sipariş sayısını gösterir.

Eşleşme sayısını sayma

SELECT
    m.MusteriID,
    m.Ad,
    COUNT(s.SiparisID) AS SiparisSayisi
FROM dbo.Musteriler AS m
LEFT JOIN dbo.Siparisler AS s
    ON s.MusteriID = m.MusteriID
GROUP BY m.MusteriID, m.Ad
ORDER BY m.MusteriID;

COUNT(s.SiparisID) yalnızca NULL olmayan değerleri sayar; bu yüzden LEFT JOIN ile doğru sonuç verir. COUNT(*) kullanırsanız eşleşmeyen müşteriler de 1 sayılır. Beklenmeyen çoğalma görürseniz DISTINCT eklemek yerine önce JOIN koşulunu ve anahtar benzersizliğini inceleyin.

Performans ve indeks notları

JOIN performansı büyük ölçüde ON koşulunda kullanılan kolonlardaki indekslere bağlıdır. Siparisler.MusteriID üzerinde bir indeks, eşleştirmeyi hızlandırır. Sorgu planını SSMS'te gerçek yürütme planı ile inceleyebilirsiniz. Ölçüm yapmadan indeks eklemek veya kaldırmak yerine planı ve bekleme istatistiklerini gözlemleyin.

  • ON koşulundaki kolonlarda uygun indeks olup olmadığını kontrol edin.
  • SELECT * yerine yalnızca gereken kolonları listeleyin.
  • Fonksiyon içine alınmış kolonlar indeks kullanımını engelleyebilir.
  • Büyük sonuç kümelerinde ORDER BY maliyetini göz önünde bulundurun.

Kontrol noktaları ve beklenen sonuç

Her adımdan sonra sonucu satır sayısı ve içerikle doğrulayın. Aşağıdaki kontrol listesi, JOIN sorgularında sık gözden kaçan noktaları kapsar.

  1. Kaynak tabloların satır sayısını ayrı ayrı SELECT COUNT(*) ile öğrenin.
  2. INNER JOIN sonucunun yalnızca eşleşen satırları içerdiğini doğrulayın.
  3. LEFT JOIN sonucunda sol tablonun tüm satırlarının korunduğunu kontrol edin.
  4. Eşleşmeyen kayıtları WHERE … IS NULL ile ayrıca listeleyin.
  5. ON ve WHERE koşullarını değiştirerek sonuç farkını karşılaştırın.
  6. Çoklu JOIN'de her ON koşulunun yazıldığından emin olun.
  7. GROUP BY ile eşleşme sayılarını kontrol ederek çoğalma olup olmadığını görün.
  8. Gerçek yürütme planında indeks kullanımını inceleyin.

Beklenen sonuç: INNER JOIN üç satır, LEFT JOIN dört satır döndürür. Eşleşmeyen müşteri sorgusu iki satır verir. Bu sayılar örnek veriye özgüdür; kendi verinizde farklı çıkması normaldir.

Geri alma ve kurtarma

JOIN sorguları veri değiştirmez, bu nedenle geri alma gerekmez. Ancak JOIN'i bir UPDATE veya DELETE ile birlikte kullanacaksanız önce etkilenecek satırları SELECT ile doğrulayın. İşlemi BEGIN TRANSACTION içinde deneyin, sonucu kontrol edin ve ardından COMMIT veya ROLLBACK ile karar verin. Aşağıdaki kalıp yalnızca yapıyı gösterir; WHERE koşulu olmadan çalıştırmayın.

Güvenli güncelleme kalıbı

BEGIN TRANSACTION;

-- 1) Etkilenecek satırları önce görün
SELECT s.SiparisID, s.Tutar
FROM dbo.Siparisler AS s
INNER JOIN dbo.Musteriler AS m
    ON m.MusteriID = s.MusteriID
WHERE m.Sehir = N'Ankara';

-- 2) Aynı koşulla güncelleyin
UPDATE s
SET s.Tutar = s.Tutar * 1.10
FROM dbo.Siparisler AS s
INNER JOIN dbo.Musteriler AS m
    ON m.MusteriID = s.MusteriID
WHERE m.Sehir = N'Ankara';

-- 3) Sonucu doğrulayın, sonra karar verin
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;

Doğrulama beklediğiniz gibi değilse ROLLBACK çalıştırın. Üretim verisinde bu kalıbı kullanmadan önce yedek aldığınızdan emin olun. BACKUP ve RESTORE ifadelerini transaction içine almayın; bunlar ayrı işlemlerdir.

Sık yapılan hatalar ve çözümleri

  • ON koşulunu unutmak: çapraz birleştirme oluşur ve satır sayısı patlar. Her JOIN'e ON ekleyin.
  • LEFT JOIN'de sağ tablo filtresini WHERE'e yazmak: sorgu INNER JOIN gibi davranır. Filtreyi ON içine taşıyın.
  • Belirsiz kolon adları: aynı adlı kolonlarda tablo takma adı kullanın.
  • Yanlış anahtar eşleştirmesi: sipariş ile ürün kimliği gibi ilgisiz kolonları eşleştirmeyin.
  • COUNT(*) ile COUNT(kolon) karışıklığı: NULL'ları saymak istemiyorsanız kolon adı verin.
  • DISTINCT ile çoğalmayı gizlemek: kök nedeni JOIN koşulunda arayın.

Sık sorulan sorular

Aşağıdaki yanıtlar, SQL JOIN nasıl kullanılır sorusuna pratik ek bilgiler verir. Tüm örnekler SQL Server T-SQL sözdizimine dayanır.

Sık sorulan sorular

INNER JOIN ile LEFT JOIN arasındaki temel fark nedir?

INNER JOIN yalnızca ON koşulunu sağlayan satırları döndürür. LEFT JOIN sol tablonun tüm satırlarını korur ve eşleşmeyen sağ kolonlara NULL yazar.

LEFT JOIN sonucunda eşleşmeyen kayıtları nasıl bulurum?

Sağ tabloya ait bir kolonda IS NULL koşulu kullanın. Örneğin WHERE s.SiparisID IS NULL, siparişi olmayan müşterileri listeler.

ON koşuluna yazdığım filtre ile WHERE filtresi neden farklı sonuç verir?

ON koşulu eşleştirme kuralını tanımlar ve sol satırları korur. WHERE ise birleştirme sonrası filtre uygular; sağ tablo koşulu NULL satırları eleyebilir.

JOIN sonrası satır sayısı neden beklediğimden fazla çıkıyor?

Sağ tabloda aynı anahtara birden çok satır düşüyor olabilir. GROUP BY ile eşleşme sayılarını kontrol edin ve anahtar benzersizliğini inceleyin.

JOIN sorguları veriyi değiştirir mi?

Hayır, salt SELECT içeren JOIN sorguları veri değiştirmez. JOIN'i UPDATE veya DELETE ile birlikte kullanırsanız önce SELECT ile doğrulayın ve transaction içinde deneyin.

Birden çok tabloyu birleştirirken nelere dikkat etmeliyim?

Her JOIN'in kendi ON koşulunu taşıdığından emin olun. Eksik koşul çapraz birleştirmeye yol açar ve sonuç kümesini büyütür.

Resmî kaynaklar

32180 Puan