SQL JOIN Nedir? INNER JOIN ve LEFT JOIN Arasındaki Farklar
Veritabanlarında bilgiler genellikle farklı tablolarda saklanır. Örneğin bir e-ticaret sisteminde müşteri bilgileri ayrı bir tabloda, sipariş bilgileri ise başka bir tabloda tutulabilir.
JOIN sayesinde bu tablolar arasında ilişki kurularak müşterilerin siparişleri, siparişlerin tutarları ve diğer bağlantılı bilgiler tek sorguyla görüntülenebilir.
SQL'de INNER JOIN ve LEFT JOIN, en yaygın kullanılan tablo birleştirme yöntemleri arasındadır.
SQL JOIN Ne İşe Yarar?
JOIN, farklı tablolarda bulunan ilişkili bilgilerin birlikte sorgulanmasını sağlar.
Örneğin bir forum yazılımında kullanıcı bilgileri kullanicilar tablosunda, forum konuları ise konular tablosunda saklanabilir.
Bir konunun başlığıyla birlikte konuyu açan kullanıcının adını görüntülemek için JOIN kullanılabilir.
Benzer şekilde e-ticaret uygulamalarında müşteriler ve siparişler, okul sistemlerinde öğrenciler ve dersler, şirket yazılımlarında çalışanlar ve departmanlar JOIN aracılığıyla ilişkilendirilebilir.
SQL JOIN Türleri Nelerdir?
|
JOIN türü |
Görevi |
|---|---|
|
INNER JOIN |
Her iki tabloda eşleşen kayıtları getirir |
|
LEFT JOIN |
Sol tablodaki bütün kayıtları ve sağdaki eşleşmeleri getirir |
|
RIGHT JOIN |
Sağ tablodaki bütün kayıtları ve soldaki eşleşmeleri getirir |
|
FULL OUTER JOIN |
Her iki tablodaki eşleşen ve eşleşmeyen kayıtları getirir |
|
CROSS JOIN |
İki tablonun satırlarının tüm kombinasyonlarını oluşturur |
|
SELF JOIN |
Bir tabloyu kendisiyle ilişkilendirerek sorgular |
JOIN türlerinin desteklenmesi kullanılan veritabanı sistemine göre değişebilir.
Örneğin PostgreSQL, FULL OUTER JOIN işlemini doğrudan desteklerken MySQL'de bu ifade doğrudan desteklenmez.
JOIN İşlemlerini Anlamak İçin Örnek Tablolar
JOIN komutlarını açıklamak için musteriler ve siparisler adlı iki tablo kullanılabilir.
Müşteriler tablosu:
|
id |
musteri_adi |
|---|---|
|
1 |
Ahmet |
|
2 |
Ayşe |
|
3 |
Mehmet |
|
4 |
Zeynep |
Siparişler tablosu:
|
id |
musteri_id |
urun |
|---|---|---|
|
101 |
1 |
Klavye |
|
102 |
2 |
Mouse |
|
103 |
1 |
Monitör |
|
104 |
3 |
Kulaklık |
Bu örnekte Ahmet'in iki, Ayşe ve Mehmet'in birer siparişi bulunmaktadır.
Zeynep'in ise sipariş kaydı bulunmamaktadır.
Bu iki tablo üzerinden INNER JOIN ve LEFT JOIN arasındaki farklar incelenebilir.
MySQL'de Örnek Tabloların Oluşturulması
Öncelikle musteriler tablosu oluşturulur.
CREATE TABLE musteriler (
id INT AUTO_INCREMENT PRIMARY KEY,
musteri_adi VARCHAR(100) NOT NULL
);
Ardından siparisler tablosu hazırlanır.
CREATE TABLE siparisler (
id INT AUTO_INCREMENT PRIMARY KEY,
musteri_id INT NOT NULL,
urun VARCHAR(100) NOT NULL,
FOREIGN KEY (musteri_id)
REFERENCES musteriler(id)
);
Bu örnekte FOREIGN KEY kısıtlaması, siparişlerin mevcut müşteri kayıtlarıyla ilişkilendirilmesini sağlar.
Tablolar oluşturulduktan sonra örnek veriler eklenebilir.
INSERT INTO musteriler (id, musteri_adi)
VALUES
(1, 'Ahmet'),
(2, 'Ayşe'),
(3, 'Mehmet'),
(4, 'Zeynep');
INSERT INTO siparisler (id, musteri_id, urun)
VALUES
(101, 1, 'Klavye'),
(102, 2, 'Mouse'),
(103, 1, 'Monitör'),
(104, 3, 'Kulaklık');
INNER JOIN Nedir?
Eşleşmeyen kayıtlar sonuçlara dahil edilmez.
Örneğin müşterilerin siparişlerini görüntülemek için:
SELECT
musteriler.musteri_adi,
siparisler.urun
FROM musteriler
INNER JOIN siparisler
ON musteriler.id = siparisler.musteri_id;
Bu sorgu, müşteri ve sipariş tablolarını müşteri numarası üzerinden birleştirir.
Sorgu sonucunda yalnızca siparişi bulunan müşteriler görüntülenir.
INNER JOIN Sorgusunun Sonucu
Örnek tablolarda INNER JOIN çalıştırıldığında aşağıdaki kayıtlar elde edilir.
|
musteri_adi |
urun |
|---|---|
|
Ahmet |
Klavye |
|
Ayşe |
Mouse |
|
Ahmet |
Monitör |
|
Mehmet |
Kulaklık |
Zeynep'in siparişi bulunmadığı için sonuçta yer almaz.
Ahmet'in iki farklı siparişi bulunduğundan adı iki satırda görüntülenir.
INNER JOIN, eşleşen her satır çifti için sonuç üretebilir. Bu nedenle bir müşteri birden fazla siparişe sahipse sonuçta birden fazla kez yer alabilir.
LEFT JOIN Nedir?
Sağ tablodaki eşleşen bilgiler de sonuçlara eklenir.
Sağ tabloda eşleşme bulunmadığında sağ tabloya ait sütunlar NULL olarak görüntülenir.
Örneğin bütün müşterileri ve varsa siparişlerini listelemek için:
SELECT
musteriler.musteri_adi,
siparisler.urun
FROM musteriler
LEFT JOIN siparisler
ON musteriler.id = siparisler.musteri_id;
Bu sorgu, sipariş kaydı bulunmayan müşterileri de sonuçlara dahil eder.
LEFT JOIN Sorgusunun Sonucu
Örnek tablolarda LEFT JOIN çalıştırıldığında aşağıdaki sonuç elde edilir.
|
musteri_adi |
urun |
|---|---|
|
Ahmet |
Klavye |
|
Ahmet |
Monitör |
|
Ayşe |
Mouse |
|
Mehmet |
Kulaklık |
|
Zeynep |
NULL |
Zeynep'in siparişi bulunmamasına rağmen müşteri kaydı sonuçta yer alır.
Ürün alanında NULL görünmesi, ilgili müşteri için eşleşen bir sipariş kaydı bulunmadığını gösterir.
Bu özellik, eksik ilişkileri veya henüz işlem gerçekleştirmemiş kullanıcıları belirlemek için kullanılabilir.
INNER JOIN ve LEFT JOIN Arasındaki Temel Fark
left.customer_id = right.customer_idLeft table
| customer_id | customer |
|---|---|
| 1 | Ava |
| 2 | Bo |
| 4 | Dee |
Right table
| customer_id | level |
|---|---|
| 1 | Gold |
| 3 | Silver |
| 4 | Bronze |
INNER JOIN · Result
| customer_id | customer | level |
|---|---|---|
| 1 | Ava | Gold |
| 4 | Dee | Bronze |
INNER JOIN ve LEFT JOIN arasındaki temel fark, eşleşmeyen kayıtların sonuçlara dahil edilip edilmemesidir.
|
Özellik |
INNER JOIN |
LEFT JOIN |
|---|---|---|
|
Eşleşen kayıtlar |
Getirilir |
Getirilir |
|
Sol tablodaki eşleşmeyen kayıtlar |
Getirilmez |
Getirilir |
|
Sağ tablodaki eşleşmeyen kayıtlar |
Getirilmez |
Tek başına getirilmez |
|
Eşleşme yoksa sağ sütunlar |
Satır oluşmaz |
NULL olur |
|
Kullanım amacı |
Yalnızca ilişkili kayıtlar |
Sol tablonun tamamını korumak |
INNER JOIN yalnızca eşleşen kayıtların gerekli olduğu sorgularda kullanılır.
LEFT JOIN ise sol tablodaki kayıtların eşleşme bulunmasa bile görüntülenmesi gerektiğinde kullanılır.
JOIN İşleminde ON İfadesi Nedir?
ON, JOIN işleminin hangi koşula göre gerçekleştirileceğini belirler.
Örneğin:
SELECT *
FROM musteriler
INNER JOIN siparisler
ON musteriler.id = siparisler.musteri_id;
Bu sorguda musteriler tablosundaki id sütunu ile siparisler tablosundaki musteri_id sütunu karşılaştırılır.
Değerler eşleştiğinde ilgili satırlar birleştirilir.
ON koşulunda eşitlik dışında başka karşılaştırmalar da kullanılabilir.
Ancak ilişkisel veritabanlarında en yaygın kullanım, ilişkili anahtar alanlarının eşitlik koşuluyla birleştirilmesidir.
JOIN İşleminde Tablo Takma Adları
SQL sorgularında tablo isimlerini kısaltmak için takma adlar kullanılabilir.
Bu yöntem, özellikle uzun sorguların okunmasını kolaylaştırır.
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
INNER JOIN siparisler AS s
ON m.id = s.musteri_id;
Bu sorguda musteriler tablosu için m, siparisler tablosu için s takma adı kullanılmıştır.
Takma adlar, sorgu içerisinde ilgili tabloları temsil eder.
LEFT JOIN ile Sipariş Vermeyen Müşterileri Bulma
Örneğin hiç sipariş vermemiş müşterileri bulmak için:
SELECT
m.id,
m.musteri_adi
FROM musteriler AS m
LEFT JOIN siparisler AS s
ON m.id = s.musteri_id
WHERE s.id IS NULL;
Bu sorgu, sipariş tablosunda eşleşen kaydı bulunmayan müşterileri getirir.
Örnek verilerde sonuç yalnızca Zeynep olacaktır.
Bu yöntem; sipariş vermeyen müşteriler, hiç mesaj yazmamış kullanıcılar veya herhangi bir kategoriye bağlı olmayan kayıtlar gibi durumların tespitinde kullanılabilir.
LEFT JOIN ile WHERE Kullanırken Dikkat Edilmesi Gerekenler
LEFT JOIN sorgularında WHERE koşulunun kullanımı, eşleşmeyen kayıtların sonuçlarda bulunup bulunmamasını etkileyebilir.
Örneğin:
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
LEFT JOIN siparisler AS s
ON m.id = s.musteri_id
WHERE s.urun = 'Klavye';
Bu sorguda sağ tablodaki ürün alanı Klavye olan kayıtlar seçilir.
Siparişi olmayan müşterilerin ürün alanı NULL olacağından bu kayıtlar sonuçtan çıkarılır.
Eğer bütün müşteriler korunarak yalnızca Klavye siparişlerinin eşleştirilmesi isteniyorsa koşul ON bölümüne yazılabilir.
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
LEFT JOIN siparisler AS s
ON m.id = s.musteri_id
AND s.urun = 'Klavye';
Bu sorguda bütün müşteriler görüntülenir. Klavye siparişiyle eşleşmeyen müşterilerin ürün alanı NULL olur.
RIGHT JOIN Nedir?
Örneğin:
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
RIGHT JOIN siparisler AS s
ON m.id = s.musteri_id;
Bu sorgu, siparisler tablosundaki bütün kayıtları korur.
Müşteri tablosunda eşleşme bulunmadığında müşteri bilgileri NULL olarak dönebilir.
Ancak örnekteki yabancı anahtar kısıtlaması, normal koşullarda geçersiz müşteri numarasına sahip siparişlerin eklenmesini engeller.
RIGHT JOIN sorguları, tabloların sırası değiştirilerek LEFT JOIN biçiminde de yazılabilir.
FULL OUTER JOIN Nedir?
Eşleşmeyen tarafın sütunları NULL olarak görüntülenir.
PostgreSQL üzerinde aşağıdaki sorgu kullanılabilir:
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
FULL OUTER JOIN siparisler AS s
ON m.id = s.musteri_id;
MySQL, FULL OUTER JOIN ifadesini doğrudan desteklemez.
MySQL'de benzer sonuçlar, LEFT JOIN ve RIGHT JOIN sorgularının uygun şekilde UNION ile birleştirilmesiyle elde edilebilir.
CROSS JOIN Nedir?
CROSS JOIN, iki tablonun satırlarının bütün kombinasyonlarını oluşturur.
Örneğin:
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
CROSS JOIN siparisler AS s;
Müşteriler tablosunda 4 kayıt ve siparişler tablosunda 4 kayıt bulunuyorsa bu sorgu 16 satır üretir.
CROSS JOIN, bütün kombinasyonların gerektiği durumlarda kullanılabilir.
Ancak büyük tablolarda sonuç sayısı hızla artabileceğinden dikkatli kullanılmalıdır.
SELF JOIN Nedir?
Örneğin bir çalışan tablosunda her çalışanın yöneticisini belirten bir sütun bulunabilir.
Bu durumda aynı tablo farklı takma adlarla iki kez kullanılarak çalışan ve yönetici bilgileri birlikte sorgulanabilir.
SELECT
c.ad AS calisan,
y.ad AS yonetici
FROM calisanlar AS c
LEFT JOIN calisanlar AS y
ON c.yonetici_id = y.id;
Bu örnek, calisanlar tablosunda id, ad ve yonetici_id sütunlarının bulunduğunu varsayar.
SELF JOIN, hiyerarşik verilerin sorgulanmasında kullanılabilir.
Üç veya Daha Fazla Tabloyu JOIN ile Birleştirme
Birden fazla tablo aynı sorguda birleştirilebilir.
Örneğin musteriler, siparisler ve urunler adlı üç tablo bulunduğu varsayılsın.
Siparisler tablosunda musteri_id ve urun_id alanları bulunsun.
SELECT
m.musteri_adi,
u.urun_adi,
s.id AS siparis_id
FROM siparisler AS s
INNER JOIN musteriler AS m
ON s.musteri_id = m.id
INNER JOIN urunler AS u
ON s.urun_id = u.id;
Bu sorgu, sipariş numarasını, müşterinin adını ve sipariş edilen ürünün adını birlikte görüntüler.
Sorgunun çalışabilmesi için ilgili tabloların ve sütunların örnekteki yapıya uygun olması gerekir.
JOIN ile COUNT Kullanımı
JOIN işlemleri toplulaştırma fonksiyonlarıyla birlikte kullanılabilir.
Örneğin her müşterinin sipariş sayısını hesaplamak için:
SELECT
m.musteri_adi,
COUNT(s.id) AS siparis_sayisi
FROM musteriler AS m
LEFT JOIN siparisler AS s
ON m.id = s.musteri_id
GROUP BY m.id, m.musteri_adi;
Bu sorgu, sipariş vermeyen müşterileri de listeler.
Örnek verilerde elde edilen sonuç:
|
Müşteri |
Sipariş sayısı |
|---|---|
|
Ahmet |
2 |
|
Ayşe |
1 |
|
Mehmet |
1 |
|
Zeynep |
0 |
COUNT(s.id), yalnızca NULL olmayan sipariş numaralarını sayar.
COUNT(*) kullanılması durumunda LEFT JOIN sonucunda siparişi olmayan müşteri için oluşturulan satır da sayılacağından farklı sonuç elde edilebilir.
JOIN ile ORDER BY Kullanımı
JOIN sorgularında sonuçlar ORDER BY ile sıralanabilir.
Örneğin müşteri adlarına göre siparişleri sıralamak için:
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
INNER JOIN siparisler AS s
ON m.id = s.musteri_id
ORDER BY m.musteri_adi ASC;
Bu sorgu, müşteri adlarını artan sırada görüntüler.
Birden fazla sütun kullanılarak daha ayrıntılı sıralamalar yapılabilir.
JOIN İşlemlerinde Performans
İlişki kurulan sütunlarda uygun indekslerin bulunması, bazı JOIN işlemlerinin daha verimli çalışmasını sağlayabilir.
Özellikle büyük tablolarda gereksiz sütunların sorgulanmaması ve uygun filtreleme koşullarının kullanılması önemlidir.
MySQL'de EXPLAIN komutu, sorgunun yürütme planını incelemek için kullanılabilir.
EXPLAIN
SELECT
m.musteri_adi,
s.urun
FROM musteriler AS m
INNER JOIN siparisler AS s
ON m.id = s.musteri_id;
Bu komut, veritabanının sorguyu nasıl çalıştırmayı planladığı hakkında bilgi sağlar.
phpMyAdmin Üzerinden JOIN Sorgusu Çalıştırma
Öncelikle phpMyAdmin arayüzünden ilgili veritabanı seçilir.
Ardından SQL bölümüne geçilir.
INNER JOIN veya LEFT JOIN içeren SQL sorgusu yazılarak çalıştırılır.
Sorgu sonucunda birleştirilen tablolardan elde edilen kayıtlar görüntülenir.
Bu yöntem, farklı tablolar arasındaki ilişkilerin incelenmesi ve sorguların test edilmesi için kullanılabilir.
JOIN Kullanırken Yapılan Hatalar
JOIN sorgularında en sık karşılaşılan sorunlardan biri, yanlış sütunların birleştirme koşulunda kullanılmasıdır.
Yanlış ON koşulları, beklenenden fazla veya eksik kayıt döndürülmesine neden olabilir.
Birden fazla tabloda aynı sütun adı bulunuyorsa sütunların tablo adı veya takma adıyla belirtilmesi gerekebilir.
LEFT JOIN sorgularında WHERE koşullarının yanlış kullanılması, eşleşmeyen kayıtların sonuçlardan çıkarılmasına neden olabilir.
Ayrıca birden çoğa ilişkilerde aynı ana tablo kaydının birden fazla satırda görüntülenmesi normaldir.
JOIN sorgularının hazırlanmasında tablolar arasındaki ilişkilerin doğru belirlenmesi önemlidir.
INNER JOIN mi LEFT JOIN mi Kullanılmalı?
INNER JOIN ve LEFT JOIN seçimi, sorgudan beklenen sonuca bağlıdır.
Yalnızca ilişkili kayıtların görüntülenmesi gerekiyorsa INNER JOIN kullanılabilir.
Örneğin yalnızca sipariş vermiş müşterilerin siparişlerini listelemek için INNER JOIN uygundur.
Sipariş vermeyen müşterilerin de görüntülenmesi gerekiyorsa LEFT JOIN kullanılabilir.
Benzer şekilde forum yazılımlarında yalnızca mesaj yazmış kullanıcılar INNER JOIN ile sorgulanabilirken, hiç mesaj yazmamış kullanıcıların da listelenmesi için LEFT JOIN kullanılabilir.
SQL JOIN Kullanımının Önemi
SQL JOIN, ilişkisel veritabanlarında farklı tablolarda saklanan bilgilerin birlikte sorgulanmasını sağlayan temel SQL özelliklerinden biridir.
INNER JOIN yalnızca eşleşen kayıtları getirirken LEFT JOIN sol tablodaki bütün kayıtları korur.
RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN ve SELF JOIN ise farklı veri birleştirme ihtiyaçları için kullanılabilir.
JOIN ifadeleri WHERE, GROUP BY, ORDER BY ve toplulaştırma fonksiyonlarıyla birlikte kullanılarak kapsamlı sorgular ve raporlar hazırlanabilir.
Tablolar arasındaki ilişkilerin doğru tanımlanması ve uygun JOIN türünün seçilmesi, verilerin tutarlı ve doğru şekilde sorgulanmasına yardımcı olur.







