İlişkisel veritabanı yönetim sistemlerinin (RDBMS) temel mantığı, veriyi tekrara düşmeden, mantıksal parçalara bölerek normalize edilmiş tablolarda saklamaktır. Bu yaklaşım veri bütünlüğünü korur ve depolama optimizasyonu sağlar. Ancak raporlama, analiz ya da kullanıcıya anlamlı bir veri seti sunma aşamasında, farklı tablolara dağıtılmış bu verilerin tekrar bir araya getirilmesi gerekir. İşte bu noktada sql join mekanizması devreye girer.
İki veya daha fazla tabloyu ortak sütunlar (genellikle birincil anahtar ve yabancı anahtar ilişkisi) üzerinden birleştirmeyi sağlayan SQL JOIN komutları, veritabanı sorgulamasının en kritik bileşenidir. Doğru join türünün seçilmemesi, yanlış sonuç kümelerine veya ciddi performans kayıplarına yol açabilir.
Örnek Tablo Yapısı
Konuyu somutlaştırmak adına iki basit tablo üzerinden ilerleyelim: kullanicilar ve departmanlar.
kullanicilar tablosu:
- id: 1, ad: Ahmet, departman_id: 10
- id: 2, ad: Mehmet, departman_id: 20
- id: 3, ad: Ayşe, departman_id: NULL
departmanlar tablosu:
- id: 10, departman_adi: Yazılım
- id: 20, departman_adi: Siber Güvenlik
- id: 30, departman_adi: İnsan Kaynakları
Bu senaryoda Ayşe henüz bir departmana atanmamıştır, İnsan Kaynakları departmanında ise henüz kayıtlı bir çalışan bulunmamaktadır.
INNER JOIN
INNER JOIN, birleştirilen her iki tabloda da eşleşen kayıtları döndürür. Eğer birinci tablodaki bir kaydın ikinci tabloda bir karşılığı yoksa ya da tam tersi bir durum geçerliyse, bu kayıtlar sonuç kümesine dahil edilmez. Varsayılan join türü genellikle budur.
SELECT kullanicilar.ad, departmanlar.departman_adi
FROM kullanicilar
INNER JOIN departmanlar ON kullanicilar.departman_id = departmanlar.id;
Bu sorgu yalnızca eşleşen satırları getirir. Ayşe’nin departman değeri NULL olduğu için, İnsan Kaynakları departmanının ise eşleşen çalışanı bulunmadığı için sonuçta yer almaz. Listede yalnızca Ahmet (Yazılım) ve Mehmet (Siber Güvenlik) görüntülenir.
LEFT (OUTER) JOIN
LEFT JOIN (veya LEFT OUTER JOIN), sol tarafta belirtilen tablodaki (FROM ifadesinden hemen sonra gelen tablo) tüm kayıtları koşulsuz olarak getirir. Sağ taraftaki tabloda (JOIN ifadesinden sonra gelen tablo) eşleşen bir kayıt varsa o bilgiler eklenir; eşleşme yoksa sağ tablonun sütunları NULL değeriyle doldurulur.
SELECT kullanicilar.ad, departmanlar.departman_adi
FROM kullanicilar
LEFT JOIN departmanlar ON kullanicilar.departman_id = departmanlar.id;
Bu sorgunun sonucunda Ahmet ve Mehmet departman bilgileriyle gelir. Ayşe bir departmana atanmamış olsa bile sol tabloda yer aldığı için listelenir; departman_adi sütunu ise NULL olarak gösterilir. Bu yöntem, bir ana tablodaki hiçbir veriyi kaybetmek istemediğiniz durumlarda tercih edilir.
RIGHT (OUTER) JOIN
RIGHT JOIN, LEFT JOIN mantığının tam tersidir. Sağdaki tablonun tüm satırlarını getirir, soldaki tabloda karşılığı olmayan satırlar için NULL değeri üretir.
SELECT kullanicilar.ad, departmanlar.departman_adi
FROM kullanicilar
RIGHT JOIN departmanlar ON kullanicilar.departman_id = departmanlar.id;
Burada departmanlar tablosundaki tüm kayıtlar (Yazılım, Siber Güvenlik, İnsan Kaynakları) listelenir. İnsan Kaynakları departmanında çalışan olmadığı için ad sütununda NULL değeri döner. Ayşe sağ tabloda bir eşleşmeye sahip olmadığı için sonuç kümesine dahil edilmez. Pratikte çoğu yazılımcı sorgu okunabilirliğini korumak için RIGHT JOIN yerine tablo sıralamasını değiştirerek LEFT JOIN kullanmayı tercih eder.
FULL (OUTER) JOIN
FULL JOIN, hem sol hem de sağ tablodaki tüm kayıtları birleştirir. Eşleşme sağlanan satırlar yan yana getirilir. Eşleşmeyen satırlar ise diğer tablodan gelen alanlar için NULL değeri alarak sonuç kümesine eklenir. Kümeler teorisindeki “birleşim” (union) işlemine benzer.
SELECT kullanicilar.ad, departmanlar.departman_adi
FROM kullanicilar
FULL OUTER JOIN departmanlar ON kullanicilar.departman_id = departmanlar.id;
Bu sorgu sonucunda hem Ayşe (departmanı NULL olarak) hem de İnsan Kaynakları (çalışanı NULL olarak) çıktıda yer alır. Eşleşen Ahmet ve Mehmet kayıtları da eksiksiz biçimde listelenir. Bazı veritabanı motorlarında (örneğin MySQL) doğrudan FULL OUTER JOIN anahtar kelimesi desteklenmez; bunun yerine LEFT JOIN ve RIGHT JOIN sorguları UNION operatörü ile birleştirilerek aynı sonuç elde edilir.
CROSS JOIN
CROSS JOIN, iki tablo arasında Kartezyen çarpım (Cartesian Product) üretir. Yani birinci tablodaki her bir satır, ikinci tablodaki tüm satırlarla teker teker eşleştirilir. Bu işlemde birleştirme koşulu (ON ifadesi) kullanılmaz.
SELECT kullanicilar.ad, departmanlar.departman_adi
FROM kullanicilar
CROSS JOIN departmanlar;
Sol tabloda 3 satır, sağ tabloda 3 satır varsa, CROSS JOIN sonucunda toplam 9 satırlık bir veri kümesi oluşur. Büyük veri setlerinde yanlışlıkla veya filtresiz çalıştırıldığında bellek ve işlemci tükenmesine neden olabilir. Olasılık hesaplamaları, matris üretimi veya kombinasyon testleri gibi özel senaryolar dışında dikkatli kullanılmalıdır.
SELF JOIN
Ayrı bir SQL komutu olmamakla birlikte, bir tablonun kendisiyle join yapılmasına verilen isimdir. Aynı tabloya iki farklı takma ad (alias) verilerek hiyerarşik veriler sorgulanabilir. Tipik örnek, bir çalışanın aynı tabloda saklanan yöneticisini bulmaktır.
SELECT c.ad AS Calisan, y.ad AS Yonetici
FROM calisanlar c
LEFT JOIN calisanlar y ON c.yonetici_id = y.id;
Bu sorguda calisanlar tablosu hem çalışan listesi hem de yönetici listesi olarak kullanılmış ve her çalışanın yöneticisi aynı satıra getirilmiştir.
Performans ve Dikkat Edilmesi Gerekenler
Büyük ölçekli veritabanlarında sql join işlemleri yüksek maliyetli olabilir. Performansı korumak için şu kurallar göz önünde bulundurulmalıdır:
- Join koşullarında kullanılan yabancı anahtar (Foreign Key) sütunlarında mutlaka indeks (index) tanımlanmalıdır.
- Gereksiz tablolara join yapmaktan kaçınılmalıdır; her join ilişkisi veritabanı motoru için ek bellek ve işlem yüküdür.
SELECT *kullanımı yerine yalnızca ihtiyaç duyulan sütunlar açıkça belirtilmelidir.- Filtreleme koşulları join aşamasında (
ONiçinde) mı yoksa sonuç kümesi oluştuktan sonra mı (WHEREiçinde) çalıştırılmalı sorusu join türüne göre optimize edilmelidir.
Özet ve Sonraki Adım
SQL JOIN yapıları, ilişkisel veritabanlarının gücünü ortaya çıkaran en temel araçtır. Hangi join türünün seçileceği, ihtiyaç duyulan sonuç kümesinde eşleşmeyen verilerin nasıl ele alınacağına bağlıdır:
- Sadece kesişim için INNER JOIN,
- Sol tarafın korunması için LEFT JOIN,
- Sağ tarafın korunması için RIGHT JOIN,
- Tüm verilerin korunması için FULL JOIN,
- Tüm kombinasyonlar için CROSS JOIN kullanılır.
Sonraki adım olarak, bir test veritabanında EXPLAIN veya EXPLAIN ANALYZE komutlarını kullanarak yazdığınız join sorgularının arka planda nasıl bir yürütme planı (Execution Plan) izlediğini inceleyebilirsiniz. Veritabanı motorunun Nested Loop, Hash Join veya Merge Join algoritmalarından hangisini seçtiğini gözlemlemek, sorgu optimizasyonu yeteneğinizi ileri seviyeye taşıyacaktır.


Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.