Belki Sql'in en önemli olup ama öğrenen öğrencilerin en çok anlamakta zorlandığı konudur Joinler. Veri tabanında join i tam olarak öğrendikten sonra yepyeni bir dünya açılacaktır yazılımcının önünde. Çünkü sürekli söylenen ilişkisel veri tabanının gücünü sonuna kadar hissedecektir yazılımcı.
Join adından anlaşılacağı gibi bağlamak birleştirmek anlamındadır.İlişkisel Veri tabanı dizaynı konusunda dikkat etmemiz gereken bir konu olarak şundan bahsetmiştik.İki tabloyu bir birine bağlayacaksak mutlaka birinin id sini ona vermemiz gerekir demiştik.
Yeniden örneklendirirsek. Bir adet ürün tablomuz olsun bu ürün tablosunda UrunId ve UrunAdi kolonları olsun. Bir de bu ürünün özelliklerinin tutulduğu UrunOzellik tablomuz olsun. Burada da kolon olarak UrunOzellikId , UrunFiyati , UrunAgirligi ve UrunId olsun. Şimdi kendimize sormamız gereken soru neden UrunOzellik tablosuna UrunId kolonunu koyduk. Çünkü bir şekilde Ürün ile Ürün Özelliği birbirine bağlamak zorundaydık. Mesala biz bir sorgu yazsak ve yazdığımız sorgu bize ürün adını ürün fiyatını gösterse,
Kod:
select u.UrunAdi, ou.UrunFiyati from Urun u
inner join UrunOzellik uo on uo.UrunId = u.UrunId
Yukarıdaki sorgudan da anlaşılacağı gibi iki ortak kolon iki tabloyu birbirine bağlamış olduk.
Peki buradaki Inner ne demek. Buradaki inner UrunId kolonundaki değerin 2 tabloda da karşılığı olması demektir. Örneğin 2 tabloda da urunId si 1 olan kaydın olduğunu bize gösterir. Eğer bir tabloda değer olup diğer tabloda olmasa idi ürün id bize bir değer döndürmeyecekti.
Şimdi bizim AdventureWorksDw2012 veri tabanımıza gidelim. Orada ki DimProductCategory ve DimProductSubCategory tablolarına bir göz atalım.
Kod:
SELECT * FROM DimProductCategory
SELECT * FROM DimProductSubcategory
Şekil 1 de görüldüğü gibi DimProductCategory tablosunda da DimProductSubCategory tablosunda da ProductCategoryKey isimli birer kolon mevcut. Demek ki biz bu iki tabloyu birbirine bu alan üzerinden bağlayabiliriz. Zatan mantık olarak her alt katagorinin ait olduğu bir kategori olmak zorundadır. İşte bu bize bir ilişki sağlar.
Şimdi sıra geldi bu iki tabloyu birbirine bağlamaya. Şimdi yapacağımız işlemde EnglishProductCategoryName ve EnglishProductSubCategoryName isimlerini alacağız.
Kod:
SELECT c.EnglishProductCategoryName,sc.EnglishProductSubcategoryName
FROM DimProductCategory c
INNER JOIN DimProductSubcategory sc ON c.ProductCategoryKey = sc.ProductCategoryKey
Gördüğümüz gibi iki kolonumuzda geldi her kategoriye bağlı alt kategoriler bir bir sıralandı. Join cidden çok güçlüdür. İşin içine girdiğiniz zaman doğru ilişkilendirilmiş bir veri tabanında kod yazmanın nekadar zevkli olduğunu sizde göreceksiniz.
Şimdi yeni bir senaryoya geçelim bir bir ürünün kategori ve alt kategorilerini sıralayalım.
Kod:
SELECT p.EnglishProductName,c.EnglishProductCategoryName,sc.EnglishProductSubcategoryName
FROM DimProductCategory c
INNER JOIN DimProductSubcategory sc ON c.ProductCategoryKey = sc.ProductCategoryKey
INNER JOIN DimProduct p ON p.ProductSubcategoryKey = sc.ProductSubcategoryKey
Görüldüğü gibi idlerden kurtularak direk olarak son kullanıcının anlayacağı bir çıktı üretmiş olduk.