SQL Join Kavramı ve Join Türleri
Join Nedir ?
Veri tabanı tasarımı ve tablo oluşturma sırasında tablolar çeşitli parçalara ayrılarak veri tekrarının önüne geçilmiş olur.
Parçalara ayrılan tablolar tek başına bir anlam ifade etmeyebilir.
Parçaların anlamlı olabilmesi için tabloların birleştirme işlemi yapılması gerekir.
SQL JOIN kullanılarak tablolar birleştirilir ve veriler anlamlı hale gelir.
Kısaca SQL Join, tabloları birleştirmek için kullanılır.
Sql Join işlemi kullanılan veri tabanına göre değişmekle birlikte genelde aşağıdaki gibidir.
SELECT tablo_adi.sutun_adi, ...
FROM tablo_A
{INNER JOIN | LEFT JOIN | RIGHT JOIN} tablo_B ON tablo_A.sutun_adi = tablo_B.sutun_adi;
Sql tabloları birbiri ile ilişkilidir ve bu ilişki bir tablodaki birincil anahtar (primary key) ile diğer tablodaki yabancı anahtar (foreign key) üzerinden kurulur. Aşağıdaki okul veritabanında bu tablolar arasındaki ilişkiler bulunuyor.
Join türlerini örneklendirmek için yukarıdaki tabloyu kullanabiliriz.
Inner Join
Inner join en çok kullanılan join türüdür ve her iki tablodaki ortak kayıtları döndürür. Bir başka ifade ile iki tablonun kesişimini ekrana döner.
Örneğin bölüm ve öğrenci tablolarını birleştirmemiz istenirse
SELECT * FROM bolum b inner join ogrenci o on b.bid = o.bid
Sorgunun sonucu aşağıdaki gibi olacaktır.
Sonuç kümesindeki ilk 4 sütun bölüm tablosunda sonraki 5 sütun ise öğrenci tablosuna aittir. Her iki tablonun ortak alanlarına bakarsanız bire-bir eşleştiklerini görürsünüz. Yani sorgu iki tablonun kesişimini döndürmüş oluyor.
Left ve Right Outer Join
Eğer bir tablodaki tüm kayıtlar ile diğer tablodaki birleştirme koşulunu sağlayan kayıtları döndürmek istersek right ve veya left outer join kullanırız.
Örneğin tüm bölümleri(öğrencisi olmayanlar dahil) ve bir bölüme kayıtlı öğrencileri sorgulamak istersek :
SELECT * FROM bolum b left join ogrenci o on b.bid = o.bid
Son kayıda dikkat ederseniz hiç öğrencisi olmayan bölüm de sonuç kümesinde mevcut. Yani soldaki tablodan (bölüm) tüm kayıtlar, sağdaki tablodan ise sadece kesişen kayıtlar gelmiş oldu.
Yukarıdaki sorguyuda left (sol) yerine right (sağ) sözcüğünü kullanmış olsaydık, tüm öğrenciler ile en az bir öğrencisi olan bölümler ekrana gelirdi. Yani left ve right yalnızca tüm kayıtların seçileceği tablonun sağdaki mi yoksa soldaki mi olacağını belirtiyor.
Full Outer Join
Tüm öğrencileri ve tüm bölümleri seçmek istersek full outer join kullanmamız gerekmektedir.
SELECT * FROM bolum b full outer join ogrenci o on b.bid = o.bid
Full outer join çok da gerekli olmadığı için MySQL’de mevcut değildir. Ama aşağıdaki gibi bir sorgu ile (union kullanarak) aynı sonuç elde edilebilir.
SELECT * FROM bolum b left join ogrenci o on b.bid = o.bid
UNION
Select * FROM bolum b right join ogrenci o on b.bid = o.bid
Yaptığımız işlemi Venn şeması ile gösterecek olursak ;
Syntax
SQL join syntax’ ı ile ilgili olarak şunları hatırlatmak istiyorum.
- Inner Join yerine sadece Join yazmamız yeterli
- Left Outer Join yerine sadece Left Join yazmamız yeterli
- Right Outer Join yerine sadece Right Join yazmamız yeterli
- Natural Join Bir de natural join var ki yazımda kolaylık sağladığı için öğrenciler tarafından tercih edilebiliyor. Ama gerçek hayatta Natural Join kullanımı sakıncalıdır. Çünkü Natural Join iki tablodaki aynı isme sahip tüm alanların eşleşip eşleşmediğine bakar.
Kısacası natural join sorgusunda tam olarak hangi alanların karşılaştırıldığı belli değildir ve bu riski artırtığı için profesyoneller tarafından tercih edilmez.
Okuduğunuz için teşekkür ederim,
Yararlı olması dileğiyle.