28 Haziran 2015 Pazar

Temel SQL Dersi 13: JOIN Elemanı 2





JOIN Elemanı 2


2 veya daha fazla tablonun belirli kolonları arasındaki ilişkilere dayanarak bu tablolardan veri çekme işlemine JOIN denir. Bu işlem için JOIN anahtar kelimesi kullanılır ama zorunlu değildir. Bir önceki yazıda ilişkili 2 tablo için yazdığımız join sorgularımızın hiçbirinde JOIN anahtar sözcüğünü kullanmamıştık. Bu yazıda hem JOIN anahtar sözcüğünün kullanımını hem de ilişkili 3 tablo için sorgu yazılışını anlatmaya çalışacağım.
Ama önce biraz ısınmak için tabloları ve sorgumuzu hatırlayalım. Bu iki tablo arasındaki ilişkiyi yayınevleri tablosundaki no alanı ile Kitaplar tablosundaki yv_no (yayınevi no) alanlarının sağladığını tekrar hatırlatalım. Aslında yv_no alanı Yayınevleri tablosunun birincil anahtarı olan no alanını referans göstermektedir. Bir tabloda, başka bir tablonun birincil anahtar alanını referans gösteren alanlara yabancı anahtar diyoruz. Burada da yv_no alanı yabancı anahtar konumunda. Örneğin Yayınevleri tablosunda 5 nolu bir yayınevi olmadığına göre Kitaplar tablosundaki yv_no alanı değerini alamaz. yv_no alanının bu örnekte alabileceği değerler 1, 2 ve 3’tür. Ancak 5 nolu bir yayınevi Yayınevleri tablosuna eklendikten sonra yv_no alanı da 5 değerini alabilir.
Yukarıdaki paragrafın Türkçesi: 5 nolu bir yayınevi olmadığına göre 5 nolu yayınevi tarafından basılmış kitap/kitaplar da olamaz.
YayınevleriKitaplar
no
isim
sehir
1AAnkara
2Bİstanbul
3Cİzmir
no
isim
yv_no
15 dakkada Java1
25 bilemedin 6 saatte SQL1
3Hakiki SQL2
Hangi kitabın hangi yayınevi tarafından basıldığını gösteren sorgu (JOIN anahtar sözcüğünü kullanmadan)
SELECT K.isim, Y.isim FROM kitaplar K, yayinevleri Y WHERE K.yv_no = Y.no
Yukarıdaki soru ile tamamen aynı işi yapan bu sorguda ise JOIN anahtar sözcüğünü kullanalım:
SELECT K.isim, Y.isim FROM kitaplar K INNER JOIN yayınevleri Y ON Y.no = K.yv_no
Her iki sorgunun da çıktısı aşağıdaki gibi olacaktır:
isimisim
5 dakkada JavaA
5 bilemedin 6 saatte SQLA
Hakiki SQLB
Birbiri ile ilişkili 3 tablo için join sorgularının nasıl yazılacağına bakmadan önce bize 3 tablo gerekiyor.
Bu yüzden veritabanımıza yazarları da dahil edelim. Ancak bir yazarın birden fazla kitabı olabileceği gibi bir kitabın da birden fazla yazarı olabilir. Bu da kitap ve yazar tabloları arasında çoğa-çok ilişki olduğunu gösteriyor. Oysa kitap ile yayınevi tabloları arasındaki ilişki bire-çok şeklindedir. Yani bir yayınevi birden fazla kitap basabilir ancak bir kitap yalnızca bir yayınevi tarafından basılabilir.
Çoğa-çok ilişkili varlıkları ifade edebilmek için veritabanına 3. bir tabloeklememiz gerekiyor. Burada bu tablonun adı KitapYazar.  KitapYazar tablosuna şöyle bir baktığımızda 1 nolu kitabı 2 nolu yazarın yazdığını, 3 nolu kitabı 1 ve 2 nolu yazarların yazdığını ya da 2 nolu yazarın 1 ve 3 nolu kitapların yazarı olduğunu görebiliyoruz.
KitaplarKitapYazarYazarlar
noisimyv_no
15 dakkada Java1
25 bilemedin 6 saatte SQL1
3Hakiki SQL2
knoyno
12
23
31
32
noisimulke
1Nihat VeritabanıTürkiye
2Muharrem NesnelTürkiye
3Taylan EsquelMeksika
Hangi kitabı hangi yazarın yazdığını isim isim listelemek istememiz durumunda 3 tabloyu da kullanan bir JOIN sorugusu yazmamız gerekir.
SELECT * FROM kitaplar K , yazarlar Y, kitapyazar KY WHERE K.no=KY.kno AND Y.no=KY.yno
veya
SELECT * FROM kitaplar K INNER JOIN kitapyazar KY ON K.no= KY.kno INNER JOIN yazarlar Y ON KY.yno=Y.no
Her iki sorgunun da çıktısı aşağıdaki gibi olacaktır:
noisimyv_noknoynonoisimulke
15 dakkada Java1122Muharrem NesnelTürkiye
25 bilemedin 6 saatte SQL1233Taylan EsquelMeksika
3Hakiki SQL2311Nihat VeritabanıTürkiye
3Hakiki SQL2322Muharrem NesnelTürkiye
Sonuç tablosunu daha sade istersek sorgularımızı yalnızca isim alanlarını getirecek şekilde düzenleyebiliriz:
SELECT K.isim,  Y.isim FROM kitaplar K , yazarlar Y, kitapyazar KY WHERE K.no=KY.kno AND Y.no=KY.yno
veya
SELECT K.isim, Y.isim FROM kitaplar K JOIN kitapyazar KY ON K.no= KY.kno JOIN yazarlar Y ON KY.yno=Y.no
Dikkat ederseniz bu sorguda INNER anahtar sözcüğünü kullanmadım çünkü aksini belirtmedikçe (yani INNER yerine outer, right, left anahtar sözcükleri ile join’in türünü belirtmedikçe) varsayılan olarak INNER JOIN işlemi yapılacaktır. Başka bir ifade ile “abi ben OUTER, RIGHT, LEFT join nedir bilmem, bana bildiğimiz JOIN lazım diyorsanız” ben de “kardeş INNER yazmasan da olur” diyorum.
Her iki sorgunun da çıktısı aşağıdaki gibi olacaktır:
isimisim
5 dakkada JavaMuharrem Nesnel
5 bilemedin 6 saatte SQLTaylan Esquel
Hakiki SQLNihat Veritabanı
Hakiki SQLMuharrem Nesnel
Sonuç olarak bu yazı beni pek tatmin etmedi. Daha samimi bir ifade ile “içime sinmedi”. Çünkü JOIN konusu veritabanı tasarımı ile doğrudan alakalı ve birincil anahtar, yabancı anahtar, tablo ilişkileri gibi bir çok kavramın önceden anlaşılmış olması gerekiyor ki bu konu tam olarak anlaşılabilsin.

Hiç yorum yok:

Yorum Gönder