SQL Join Kullanımı ve Çeşitleri
İlişkisel veritabanı sistemlerinde veriler tek bir tablo içerisinde tutulmazlar. Genellikle tablolar normalizasyon kurallarına tabi tutularak farklı farklı tablolara dağıtılırlar. Bu sayede tablolardaki veri tekrarının önüne geçerek verilerin tutarlılıkları sağlanmaya çalışılır.
Normalizasyon konusu biraz daha derin ve uzun bir konu olduğu için şimdilik burada bahsetmeyeceğim. İlerleyen zamanlarda bu konu hakkında da yazmaya çalışacağım.
Farklı farklı tablolarda birbirleriyle ilişkili olan verileri tek bir sorgu içerisinde göstermek için bu tabloları bir birleriyle bağlama işlemine join denir.
Sql Server’da mantıksal join operatörlerini
- Inner join
- Left outer join
- Right outer join
- Full outer join
- Cross join
olarak sayabiliriz. (Aynı zamanda fiziksel join tipleri de vardır. Bunlara başka bir yazı da değineceğim.)
Bu join tiplerini anlatmaya başlamadan önce aşağıdaki diagramda bulunan tabloları kullanarak örnekler vereceğim.
Tablo Yapısı
Tablolardaki Kayıtlar
Mantıksal Join Tipleri
- INNER JOIN: Bu tip join ile sadece eşleşen kayıtlar döndürülür. Örnek olarak, “Product” ve “ProductModel” tabloları arasında ProductModelID’si eşleşen kayıtları döndürmek için kullanılabilir:
SELECT *
FROM dbo.Product p
INNER JOIN dbo.ProductModel pm on p.ProductModelID = pm.ProductModelID
2. LEFT JOIN: Bu tip join ile sol tablodaki tüm kayıtlar döndürülür ve eğer sağ tabloda eşleşen kayıt yoksa sağ tablodaki alanlar NULL olarak döndürülür. Örnek olarak, “Product” tablosundaki tüm ürünleri ve onların modellerini döndürmek için kullanılabilir:
SELECT *
FROM dbo.Product p
LEFT OUTER JOIN dbo.ProductModel pm on p.ProductModelID = pm.ProductModelID
3. RIGHT JOIN: Bu tip join ile sağ tablodaki tüm kayıtlar döndürülür ve eğer sol tabloda eşleşen kayıt yoksa sol tablodaki alanlar NULL olarak döndürülür. Örnek olarak, “ProductModel” tablosundaki tüm Ürün Modellerini ve onlara ait ürünleri döndürmek için kullanılabilir:
SELECT *
FROM dbo.Product p
RIGHT OUTER JOIN dbo.ProductModel pm on p.ProductModelID = pm.ProductModelID
4. FULL OUTER JOIN: Bu tip join ile hem sol tablodaki tüm kayıtlar, hem de sağ tablodaki tüm kayıtlar döndürülür. Eğer bir tabloda eşleşen kayıt yoksa o tablodaki alanlar NULL olarak döndürülür. Örnek olarak, “Product” ve “ProductModel” tablolarındaki tüm kayıtları ve eşleşmelerini döndürmek için kullanılabilir:
SELECT *
FROM dbo.Product p
FULL OUTER JOIN dbo.ProductModel pm on p.ProductModelID = pm.ProductModelID
5. CROSS JOIN: Cross join, iki tabloyu kesiştirerek ilk tablodaki her bir kayıt ile ikinci tablodaki her bir kayıt arasında bir eşleşme oluşturur. (Kartezyen Çarpımı)
Örneğin, “Product” tablomuzdaki 10 kayıt ve “ProductModel” tablomuzda 2 kayıt varsa (ben bu örnek için ProductModel tablosundaki diğer 18 kaydı silerek 2 kayıt bıraktım), Cross join kullanarak oluşacak eşleşmelerin sayısı 10 x 2= 20 olacaktır.
Örnek olarak, “Product” ve “ProductModel” tabloları arasında Cross join yapmak için aşağıdaki sorgu kullanılabilir:
SELECT *
FROM dbo.Product p
CROSS JOIN dbo.ProductModel pm
Bu sorgu, “Product” tablosundaki tüm kayıtlar ile “ProductModel” tablosundaki tüm kayıtları teker teker eşleştirerek conusu döndürecektir.
Cross join kullanımı genellikle, büyük tablolarda eşleşmelerin sayısı çok olacağından, sorgunun performansı düşeceğinden ve dönen veri miktarı büyüyeceğinden dolayı tavsiye edilmez. Yukarı bahsettiğimiz diğer join tipleri olan INNER JOIN, LEFT JOIN, RIGHT JOIN ve FULL OUTER JOIN tercih edilir.
Faydalı olması dileğiyle.