T-SQL JOIN Kavramı

JOIN işlemleri, T-SQL’de birden fazla tablodaki verileri birbirine bağlamak (ilişkilendirmek) için kullanılan temel bir veritabanı işlemidir. İlişkisel veritabanlarının en güçlü özelliklerinden biridir.

Şimdi join yapısı olmadan önce tablolarımız genel olarak aşağıdaki yapıda birleştirilmektedir. Sonuç olarak iki tablomuzun aynı satırda olmaması diğer satırların NULL olmasına sebebiyet verecektir.

select*from Personeller,PersonelBolgeler
select s.Adi,*from Personeller s,PersonelBolgeler b where s.PersonelID= b.PersonelID

JOIN, iki veya daha fazla tablo arasında ortak bir sütun (genellikle anahtar alanlar) kullanılarak verilerin birleştirilmesi işlemidir. Tablolar arasında tanımlı ilişkiler sayesinde anlamlı veri kümeleri oluşturmayı sağlar.

 INNER JOIN: Yalnızca her iki tabloda da eşleşen kayıtları döndürür. Eşleşme olmayan kayıtlar sonuç kümesine dahil edilmez. Her iki tablonun ortak olan alanı almaktadır. En hızlı join türlerinden biridir.

TabloA ∩ TabloB (Kesişim kümesi)

Hangi personelin hangi satışları yaptığını aşağıdaki komutla görebiliriz.

select*from Personeller p inner join Satislar s on s.PersonelID=p.PersonelID

İlgili sorgu çalıştıktan sonra iki tabloyu yan yana ekleme işlemi yapmaktadır. İkinci joinlenen tablo en sağda olmaktadır.

Aşağıdaki komut ile hangi ürünün hangi kategoriye ait olduğunu görebiliriz.

select u.UrunAdi,k.KategoriAdi from Urunler u join Kategoriler k on k.KategoriID=u.KategoriID

Join işlemlerinde Where koşulu aşağıdaki gibi kullanılmaktadır.

select u.UrunAdi,k.KategoriAdi from Urunler u join Kategoriler k on k.KategoriID=u.KategoriID where k.KategoriAdi ='Beverages'

Aşağıdaki komut ise Beverages kategorisindeki ürünlerin sayısını bulabiliriz.

select k.KategoriAdi,count(u.UrunAdi) from Urunler u join Kategoriler k on k.KategoriID=u.KategoriID 
where k.KategoriAdi ='Beverages' group by k.KategoriAdi

Birden fazla tablo aşağıdaki komut ile birbirlerine bağlanmaktadır. İlk join işleminde yapılan ifadeyi bir tablo olarak kabul edip ikinci tabloya bağlamaktadır.

select T.TedarikciID,U.UrunAdi from Urunler u join Tedarikciler t on t.TedarikciID=u.TedarikciID 
inner join Personeller s on s.PersonelID=u.PersonelID  where t.Faks not like 'NULL'

Aynı tablolar ilişkisel olarak join işlemini yapmaktadır.

select p.adi,s.Adi from Personeller p join Personeller s on p.BagliCalistigiKisi=p.PersonelID

Aşağıdaki örneğimizde ismi m ile başlayan personelin adı soyadı ile birlikte gruplanıp 10 adet üzeri ürün satan kişileri getirmek istediğimizde aşağıdaki komut kullanılmaktadır.

select p.Adi +' '+p.SoyAdi, count(s.SatisID) from Personeller p join Satislar s on p.PersonelID=s.PersonelID where p.Adi like'm%'
group by p.Adi +' '+p.SoyAdi having count(s.SatisID)>10

Dikkat edilirse select ifadesinde çağrılacak kolonlar ile group by kısmında çağrılacak kolonlar aynıdır.

Tüm personelin toplamda ne kadar satış yaptığını bulmak için aşağıdaki komut kullanılmaktadır.

select p.Adi +' '+p.SoyAdi as Personel, count(s.SatisID) as Toplam_satıs from Personeller p join Satislar s on p.PersonelID=s.PersonelID 
group by p.Adi +' '+p.SoyAdi 

En çok satış yapan personeli bulmak için aşağıdaki komut kullanılmaktadır.

select p.Adi +' '+p.SoyAdi as Personel, count(s.SatisID) as Toplam_satıs from Personeller p join Satislar s on p.PersonelID=s.PersonelID 
group by p.Adi +' '+p.SoyAdi order by Toplam_satıs desc 

Bir başka örnekte ise adında a harfi olan personellerin satış id si 10500 den büyük olan satışların toplam tutarını ve bu satışların hangi adın gerçekleştrdiğini gösterelim.

select p.adi,S.SatisTarihi, sum(d.BirimFiyati*Miktar) as TOPLAM from Personeller p join Satislar s on p.PersonelID=s.PersonelID join [Satis Detaylari] d on d.SatisID=s.SatisID
where p.Adi like '%a%' and d.SatisID>10500 group by p.adi,S.SatisTarihi ORDER BY S.SatisTarihi DESC 

LEFT OUTER JOIN: Sol tablodaki (FROM’daki tablo) TÜM kayıtları getirir. Sağ tabloda eşleşme yoksa NULL değerler döndürür. Outer kelimesinide kullanmayarak joinleme işlemi yapılabilmektedir.

Mantıksal İşlem:

TabloA + (TabloA ∩ TabloB)

Aşağıdaki komut tüm kullanıcıları getirmekte sipariş olmayan kullanıcı değerleri NULL olarak dönmektedir.

SELECT *FROM Kullanicilar K LEFT JOIN Siparisler S ON S.KullaniciID=K.KullaniciID

Aşağıdaki komutta ise Tüm siparişlere ve karşılığı olan Kullanıcıları getirmektedir. Tüm sipariş id’ye sahip tüm kullanıcılar bulunmaktadır.

RIGHT OUTER JOIN: Sağ tablodaki (JOIN’den sonraki tablo) TÜM kayıtları getirir. Sol tabloda eşleşme yoksa NULL değerler döndürür. RIGHT JOIN şeklinde yazılmaktadır.

Mantıksal İşlem:

(TabloA ∩ TabloB) + TabloB

Aşağıdaki sorgu ile ilk olarak sağ tarafta bulunan Siparisler tablosunu alıp eşleşen kullanıcı id değerini getirmektedir.

SELECT *FROM Kullanicilar K RIGHT JOIN Siparisler S ON S.KullaniciID=K.KullaniciID

Aşağıdaki komut ise Kullanıcılar tablosunu refarans alır. Eşleşmeyenleri NULL olarak döndürmektedir.

SELECT *FROM Siparisler S RIGHT JOIN Kullanicilar K ON S.KullaniciID=K.KullaniciID

FULL OUTER JOIN: Her iki tablodaki TÜM kayıtları getirir.Eşleşme olmayan durumlarda NULL değerler döndürür. FULL JOIN şeklinde de yazılabilir.

Mantıksal İşlem:

TabloA ∪ TabloB 

Aşağıdaki örnekte Sipariş tablosu ilk olarak getirilir. Daha sonra Kullanıcılar tablosu getirilir. Eşleşmeyen kayıtlar NULL olarak dönmektedir.

SELECT *FROM Kullanicilar K FULL OUTER  JOIN Siparisler S ON S.KullaniciID=K.KullaniciID

Tabloların sağ kısımda veya sol kısımda olması bir şey değiştirmez ikinsin de aynı sonuç dönmektedir.

SELECT *FROM Siparisler S FULL JOIN Kullanicilar K ON S.KullaniciID=K.KullaniciID

CROSS JOIN: İki tablo arasında koşulsuz birleştirme yapar. Birinci tablonun her satırını ikinci tablonun her satırıyla eşleştirir. Kartezyen çarpımı yapmaktadır. Cross join kullanılan sorguya şart ifadesi verilemez.

Mantıksal İşlem:

TabloA × TabloB (Kartezyen çarpım)

Tablolarımızda kaç satırın olduğunu görmüş olalım.

select count(*) from Kullanicilar

select count(*) from Siparisler

Aşağıdaki komut ile kullanıcılar tablosundaki her kayıt ilk sipariş kaydı ile eşleştirilmektedir. Aşağıdaki komut çalıştırıldığında toplamda 360 kayıt dönmektedir.

Joinleme işlemini tam tersi yaparsak aynı sonuç geldiğini görmüş olacağız.

select *from  Siparisler S cross join Kullanicilar K 

Performans anlamında join işlemlerinde başarılı olmak için join koşullarında kullanılan sütunların indexslenmesi performans anlamında bizlere katkı sağlayacaktır. İhtiyaç duyulan kolonların seçilmesi daha başarılı ve hızlı sonuç dönmemizi sağlar. join yapılan kolonlarda where vb.. sart ifadelerinin kullanılması performans anlamında bizlere katkı sağlayacaktır.

JOIN işlemleri, veritabanı sorgularının en kritik parçalarından biridir ve doğru kullanıldığında çok güçlü veri analizleri yapmanızı sağlar.

Başka makalede görüşmek dileğiyle..

“Allah, sizin düşmanlarınızı çok daha iyi bilir. Allah, dost olarak yeter. Allah, yardımcı olarak da yeter.” Nisa Suresi; 45. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir