Birden Çok Tabloda Sorgulama (Join)

Eyl 08, 2013
Join(Birleştirici), iki ya da daha fazla tabloyu aynı anda sorgulayarak bir sonuç tablosu (result table) oluşturmaya yarar. Örneğin: İki tabloyu birleştirici ile birleştirerek sonuç tablosu oluşturmak istenirse her iki tabloda da aynı olan alanlardan yola çıkılır. Böylece alanları kullanarak istenilen sonuç tablosu oluşturulabilir.

3 tip birleştirici (join) kullanılır: 
  • Inner Join (iç birleştirici)
  • Outer Join (dış birleştirici)
  • Cross Join (çapraz birleştirici)

Bu birleştiriciler dışında SELECT ifadesini kullanarak iki ya da daha fazla tablo üzerinde sorgulama yapılabilir. SELF JOIN kullanarak bir tablonun kendiyle birleştirilmesi sağlanabilir.

Birleştiricilerde kullanılan JOIN ifadesi hangi tabloların birleştirileceğini belirler. ON ifadesi ise tabloların hangi alanlar üzerinden birleştirileceğini belirler. Birleştirilen alanların birincil anahtar ya da ikincil anahtar olması tercih edilir. Ortak alanların aynı veri tipine sahip olmaları gerekir. Karışıklık yaşanmaması açısından alan isimleri tabloların isimleri ile birlikte yazılır vetablo_adı.kolon_adı şeklinde ifade edilir.

Inner Join

INNER JOIN, iki ya da daha fazla tabloda ortak olan iki alandaki değerleri kontrol ederek tabloları birleştirir. INNER JOIN, SQL sunucusunda varsayılan olan JOINdir. INNER JOIN yerine sadece JOIN yazmak da yeterlidir. WHERE ifadesi kullanarak oluşturmak istenen sonuç tablosu daha da özelleştirilebilir. JOIN kullanırken "null" değerlerini birleştirme şartı olarak kulanmamak gerekir.

Örnek: INNER JOIN ile sorgu yapabilmek için ogrenci ve bolum adında iki tablo bulunsun. Belirli bir bölüm adı verilerek iki tablo, daha önceden ilişki kurulmuş kolonları üzerinden INNER JOIN ile birleştirilip, tablolara ait olan bazı kolonlar şu şekilde sorgulanır:

Yapılan sorgu sonucunda ogrenci ve  bolum tablolarından, sorgulanmak istenen ogrenciAd, girisYili, alinanKredi ve bolumAd isimli kolonlar sonuç olarak ekrana basılmıştır. Her seferindetabloAdı.kolonAdı şeklinde uzun ifadeler yazmamak için her iki tablo için as anahtar kelimesi sayesinde takma isimler (alias) kullanılmıştır. Sonuç olarak bölümü "Bilgisayar" tüm öğrencilerin bazı bilgileri ekranda görülmektedir. 

Outer Join

FULL JOIN, LEFT OUTER JOIN ve RIGHT OUTER JOIN, ortak alanlar vasıtasıyla birleştirme yaparken birleştirme şartına uymayan satırlarda "null" değeri oluşmasını sağlar.

OUTER JOIN sadece iki tablo arasında kullanılır. LEFT OUTER JOIN kullanılırsa ifadenin solunda ismi yazan tabloda istenilen alanda tüm satırlar sonuç tablosunda gösterilir. RIGHT OUTER JOIN kullanılırsa ifadenin sağında ismi yazan tabloda istenilen alanda tüm satırlar sonuç tablosunda gösterilir. FULL JOIN kullanılırsa, her iki tablodan da tüm satırlar çekilerek sonuç tablosunda gösterilir.  LEFT OUTER JOIN için kısaca LEFT JOIN, RIGHT OUTER JOIN için de kısaca RIGHT JOIN kullanılır.

Örnek: FULL JOIN kullanarak sorgu yapabilmek için ogrenci ve bolum tablolarını kullanalım. Daha önceden ilişki kurulmuş bolumId kolonu üzerinden FULL JOIN ile birleştirilip, tablolara ait olan bazı kolonlar şu şekilde sorgulanır:

 

Yapılan sorgu sonucunda ogrenci ve bolum tablolarından, sorgulanmak istenen "ogrenciAd", "girisYili", "alinanKredi", "bolumAd", ve "kalanStaj" isimli kolonlar sonuç olarak ekranda gösterilmiştir. Sonuç olarak iki tablo bolumId kolonları üzerinden birleştirilerek sorgulanmış ve iki tablodaki tüm satırlar sonuç tablosunda görülmektedir. Sonuç tablosunda bazı bölümlere ait öğrenci bulunmadığı için öğrenci tablosunda çekilen kolonlar "null" gözükmektedir. Bunun yanısıra bazı öğrencilerin okuduğu bölümler bolum tablosunda bulunmadığı için, bolumtablosundan çekilen kolonlar "null" gözükmektedir.

Örnek: LEFT OUTER JOIN kullanarak sorgu yapabilmek için ogrenci ve bolum tablolarını kullanalım. Daha önceden ilişki kurulmuş bolumId kolonu üzerinden LEFT OUTER JOIN ile birleştirilip, tablolara ait olan bazı kolonlar şu şekilde sorgulanır: 

 

Yapılan sorgu sonucunda ogrenci ve bolum tablolarından, sorgulanmak istenen "ogrenciAd", "girisYili", "alinanKredi" "bolumAd" ve "kalanStaj" isimli kolonlar sonuç olarak ekranda gösterilmiştir. Sorgu "Left Outer Join" ile yapıldığı için ogrenci tablosunda tüm satırlar, bolumtablosunda karşılıkları olmasa da sonuç tablosunda yer almaktadır. Bunun sonucunda o satırlarda bulunan ve bolum tablosundan gelen kolonlar "null" gözükmektedir.

Örnek: RIGHT OUTER JOIN kullanarak sorgu yapabilmek için ogrenci ve bolum tablolarını kullanalım. Daha önceden ilişki kurulmuş bolumId kolonu üzerinden RIGHT OUTER JOIN ile birleştirilip, tablolara ait olan bazı kolonlar şu şekilde sorgulanır:  

 

Yapılan sorgu sonucunda ogrenci ve bolum tablolarından, sorgulanmak istenen "ogrenciAd", "girisYili", "alinanKredi" "bolumAd" ve "kalanStaj" isimli kolonlar sonuç olarak ekranda gösterilmiştir. Sorgu RIGHT OUTER JOIN ile yapıldığı için bolum tablosundaki tüm satırlar,ogrenci tablosunda karşılıkları olmasa da sonuç tablosunda yer almaktadır. Bunun sonucunda o satırlarda bulunan ve ogrenci tablosundan gelen kolonlar "null" gözükmektedir.

Cross Join

CROSS JOIN tablolar arasında yapılan birleştirme işleminde seçilen alanlar arasındaki tüm kombinasyonları sonuç tablosu olarak vermeyi sağlar. Veritabanlarında fazla kullanılmayan bir yöntem olan CROSS JOIN'in oluşturduğu sonuç tablosunda satır sayısı, alanların kartezyen çarpım sayısı kadardır. Örneğin; ilk alanda 4, ikinci alanda 3 satır varsa 3*4=12 tane satır oluşacaktır.

Örnek: CROSS JOIN kullanarak sorgu yapabilmek için ogrenciler ve dersler adında iki tablo bulunsun. CROSS JOIN ile iki tablo şu şekilde birleştirilir:

 

Bu şekildeki bir T-SQL betiği ile ogrenciler ve dersler tablolarının "ogrenciAd" ve "dersAd" kolonları kartezyen çarpılmış, oluşan satırlar notlar adındaki yeni bir tablonun satırları haline getirilerek, bu tabloya "notu" kolonu sonradan eklenmiştir. Oluşan notlar tablosunun görüntüsü şu şekildedir:

 

Self Join 

Bir tablonun kendisi ile JOIN işlemine tabi tutulmasına SELF JOIN adı verilir. Bir tablo içinde bulunan satırlar arasında referans ilişkisi varsa, o tablo için farklı takma adlar (alias) kullanılarak Join sorguları gerçekleştirilebilir. Çok kullanılan bir yöntem değildir.

Örnek: SELF JOIN ile sorgu yapabilmek için personel adında bir tablo olsun. SELF JOIN ile bir  tablo şu şekilde kendisi ile birleştirilir:

 

 

Yapılan sorguda personel tablosu p_1 ve p_2 olmak üzere iki takma ad kullanılarak iki bağımsız tablo gibi gösterilmiş ve INNER JOIN anahtar kelimeleri kullanılarak birleştirilmiştir. Burada dikkat edilmesi gereken nokta şudur ki; tek bir personel tablosu mevcuttur. Bunun yanısıra bir personel diğer bir personelin yöneticisi konumunda olabilir. Bi şekilde satırlar arası referans ilişkileri bulunan tablolardan sorgu yapılıken SELF JOIN kullanılabilir.    

Union 

Join ifadelerinin dışında birden çok tabloda sorgu yapmak için kullanılan yöntemlerden biri de UNION anahar kelimesi ile yapılan sorgulardır. Birden çok SELECT ifadesinin kullanılarak tek sorgulama ile oluşturulamayan sonuç tablolarının yaratılmasını sağlar. Birleştirilmek istenen tabloların belirlenen alanlarının veri tipleri ve tablolardan alınacak sütun sayıları aynı olmalıdır. Alan isimleri ilk SELECT ifadesinde belirlenir. Eğer alan isimlerinde değişiklik yapılacaksa bunun ilk SELECT cümleciğinde yapılması gerekir. Sonuç tablosunda tüm oluşabilecek satırları (aynı satırdan birden çok olsa bile) göstermek için UNION'dan sonra ALL  kullanılır. Belli bir alanı referans alarak sıralama yapmak istenirse, ORDER BY ifadesini kullanmak gerekmektedir.

Örnek: UNION operatörünün kullanımını görmek adına iki "bolum_1" ve "bolum_2" adında iki tablo olsun. Farklı iki fakültede bulunan bölümlerin bulunduğu bu tablolardan belli kolonlar UNION anahtar kelimesi ile şu şekilde birleştirilebilir: