İLİŞKİSEL VERİTABANLARINDA BİRLEŞTİRME Bazı Veri tabanları sadece 1 tablodan oluşmaz. Bunun sebebi genellikle veri tekrarını önlemektir. Bu şekilde oluşturulmuş veri tabanlarında, tablolardaki değerleri birbirleriyle ilişkili bir şekilde kullanabilmek için Tablo Birleştirme işlemi yapılır. Bu birleştirme işlemi 2 farklı tablo için de söz konusu olabilir, ikiden fazla sayıda tablo için de söz konusu olabilir. Dikkat edilmesi gereken nokta, tabloların Primary Key ve Foreign Key ler ile birbirlerine bağlanmış olması gerektiğidir. Birkaç örnek yapmak üzere, 2 farklı tablo oluşturalım ve onları birbirine bağlayalım: Filmler Tablosu ; film_no film_adi tarih imdb_puan tur_id 1 The Shawshank Redemption 1994 9,2 1 2 The Dark Knight 2008 8,8 7 3 Fight Club 1999 8,8 1 4 Forrest Gump 1994 8,6 5 Leon 1994 8,6 1 6 V For Vandetta 2006 8,1 7 7 A Beautiful Mind 2006 8,0 8 Eternal Sunshine of the Spotless Mind 2004 8,4 2 9 Inception 2010 8,8 3 10 Good Will Hunting 1997 8,1 1 Türler tablosu ; tur_id tur_adi 2 Romantik 3 Bilim Kurgu 4 Macera 5 Gerilim 6 Korku 7 Suç
Gördüğünüz gibi tablolar Tur_ID sütunları temel alınarak birbirlerine bağlandı. Bu arada her filmin sadece bir türe sahip olabileceğini varsayarak bu tabloları oluşturdum. Not: Filmler tablosunda bazı filmlere tür belirlemedim, bunun sebebi yazının devamında yer alacak. Tablo birleştirme işlemini 2 farklı yöntem ile yapabilirsiniz ; WHERE ile sorgu koşulu belirleyerek Tablo Birleştirme JOIN komutlarını kullanarak Tablo Birleştirme WHERE ile Sorgu Koşulu Belirleyerek Tablo Birleştirme Şimdi iki tabloyu birleştirerek, filmlerin türlerine ulaşalım. Bunun için WHERE komutu ile birleştirme işlemine bir Birleştirme Koşulu belirlememiz gerekiyor. SELECT filmler.film_adi, filmler_turu.tur_adi FROM filmler, filmler_turu WHERE filmler.tur_id = filmler_turu.tur_id Burada F ve T, tablolar için belirlenmiş kısa adlardır. Eğer birleştirme koşulu belirtilmeseydi, VTYS iki farklı tablodaki her değer için kartezyen çarpım yapacaktı ve 70 farklı sonuç elde edecektik. Dolayısıyla istediğimiz sonuca ulaşamayacaktık. Tablo birleştirme 2 den fazla sayıda tablo için de uygulanabilir. Böyle bir durumda sorgu koşulu giderek büyüyecektir. JOIN komutlarını kullanarak Tablo Birleştirme Tablo birleştirirken, WHERE ile birleştirme koşulu kullanmak yerine JOIN ifadelerini kullanabilirsiniz. Bu ifadeler dörde ayrılı ve şu şekildedir; INNER JOIN LEFT JOIN RIGHT JOIN
Dikkat ettiyseniz yukarıda Türü olmayan filmler var. Sorgu koşulu ile tablo birleştiriyorsanız, türü olmayan filmler sorgu sonucunda bize gösterilmeyecektir. Çünkü Filmler tablosundaki Tur_ID sütununun, Türler tablosunda bir karşılığı olmayacaktır. Fakat Join ifadelerini kullanarak tablo birleştirme yapıyorsanız, türü olmayan filmleri de gösterebilirsiniz. Yani JOIN ifadeleri 2 tablo için eşleşen verileri gösterip göstermeme durumlarına göre ayrılmışlardır. INNER JOIN: 2 tablo için de boş verileri, yani bir tabloda Tur_ID si olan fakat diğerinde olmayan verileri temizler ve göstermez. Aşğıdaki gibi kullanabilirsiniz ; SELECT filmler.film_adi, filmler_turu.tur_adi FROM filmler INNER JOIN filmler_turu ON filmler.tur_id = filmler_turu.tur_id ORDER BY filmler_turu.tur_adi LEFT JOIN: Bu tür birleştirme kullanıldığında ifadenin solundaki tablo (tablo1) belirleyici tablodur. Bu tablonun diğer tabloyla ilişkisi bulunsun veya bulunmasın tüm
satırları listeleyecektir. Sağdaki tabloda ise (tablo2) sadece ilişkili satırlar listelenecektir. Belirleyici tablonun içerdiği değerin diğer tabloda karşılığı yoksa boş olarak yani NULL değer içerir. İlk (Filmler) tablo için boş olan verileri de göstermenizi sağlar. Yani Filmler tablosunda Tur_ID değeri boş olarak gösterilecektir. Aşağıdaki sorgu, türü olmayan filmler dahil tüm filmlerin adlarını, türlerini ve IMDB Puanlarını, IMDB Puanlarına göre sıralayarak listeleyecektir. SELECT filmler.film_adi, filmler_turu.tur_adi, imdb_puan FROM filmler LEFT JOIN filmler_turu ON filmler.tur_id = filmler_turu.tur_id ORDER BY imdb_puan RIGHT JOIN: Bu tür birleştirme kullanıldığında ifadenin solundaki tablo (tablo2) belirleyici tablodur. Bu tablonun diğer tabloyla ilişkisi bulunsun veya bulunmasın tüm satırları listeleyecektir. Sağdaki tabloda ise (tablo1) sadece ilişkili satırlar listelenecektir. Belirleyici tablonun içerdiği değerin diğer tabloda karşılığı yoksa boş olarak yani NULL değer içerir. İkinci (Türler) tablo için boş olan verileri de göstermenizi sağlar. Aşağıdaki gibi kullanabilirsiniz ;
SELECT F.film_adi, T.tur_adi, imdb_puan FROM filmler F RIGHT JOIN filimler_turu T ON F.tur_id = T.tur_id ORDER BY imdb_puan Sonuç Olarak; Tablo birleştirme işlemini 2 farklı şekilde yapabilirsiniz; WHERE ile sorgu koşulu kullanmak ve JOIN ifadelerini kullanmak. WHERE ile sorgu koşulu oluşturmak için 2 tablonun Primary Key ve Foreign Key sütunları baz alınır ve onlar üzerinden birleştirme işlemi yapılır. JOIN ifadeleri ile tablo birleştirilirken eşleşme durumları önemlidir. Eşleşme durumlarına göre üçe ayrılmaktadırlar: INNER, LEFT, RIGHT.