28 Haziran 2015 Pazar

Temel SQL Dersi 12: JOIN Elemanı 1


JOIN Elemanı 1

Bundan önceki tüm sorguların içerisinde yalnızca bir tablo kullanmıştık. Bu sorgular temel SQL işleçleri için birer örnekti. Bu ders ile beraber SQL’in esaslı konularına giriş yapıyoruz. Gerçek hayatta ihtiyacımız olan bilgileri bize döndürecek olan sogular nadiren önceki derslerde anlatılanlar kadar basit olacak.
Veritabanları çoğu zaman birden fazla tablo içerir.Ve bu tablolar birbiri ileilişkilidir. Örneğin aşağıdaki Yayinevleri ve Kitaplar tablolarını inceleyelim.
YayınevleriKitaplar
no
isim
sehir
1AAnkara
2Bİstanbul
3Cİzmir
no
isim
yv_no
15 dakkada Java1
25 bilemedin 6 saatte SQL1
3Hakiki SQL2
Dikkat ederseniz Kitaplar tablosunda yv_no isimli bir alan göreceksiniz. Bu alan kitabın hangi yayınevi tarafından basıldığını göstermektedir. Buradan ilk 2 kitabın “A”, 3. kitabın ise “B” yayınevi tarafından basıldığını, “C” yayınevi tarafından ise basılmış bir kitabın bulunmadığı anlaşılmakta. Yani kitaplar tablosundaki yv_noisimli alan ile Yayınevleri tablosundaki no isimli alan ilişkilidir.
Örneğin Kitaplar tablosuna yeni bir kitap eklemek istesek ve yv_no olarak 4 değerini versek, 4 nolu yayınevi mevcut olmadığından bunun mümkün olmadığını belirten bir hata mesajı ile karşılaşırız. Şimdi bu iki tabloyu kullanan (iki tabloyujoin eden) sorgu örneklerine geçelim:
Not: MySQL’i bilgisayarınıza kurup benzer örnekleri bizzat uygulamak istersenizbu videoyu izleyebilirsiniz.
SELECT * FROM kitaplar , yayinevleri
Sorgunun çıktısı aşağıdaki gibi olacaktır:
noisimyv_nonoisimsehir
15 dakkada Java11AAnkara
25 bilemedin 6 saatte SQL11AAnkara
3Hakiki SQL21AAnkara
15 dakkada Java12Bİstanbul
25 bilemedin 6 saatte SQL12Bİstanbul
3Hakiki SQL22Bİstanbul
15 dakkada Java13Cİzmir
25 bilemedin 6 saatte SQL13Cİzmir
3Hakiki SQL23Cİzmir
Bu tablonun ilk bakışta ne kadar anlamsız göründüğünü biliyorum. Ama aslında o kadar da değil. Bu tablo yukarıdaki 2 tablonun kartezyen çarpımı. Her iki tabloda da 3’er kayıt var. Bu tabloda ise 3×3=9 kayıt (satır) mevcut. Şimdi sorgumuzu aşağıdaki gibi değiştirelim:
SELECT * FROM kitaplar, yayinevleri WHERE kitaplar.yv_no = yayinevleri.no
Yukarıda Kitaplar tablosundaki yv_no ile Yayinevleri tablosundaki no alanlarının ilişkili olduğunu söylemiştik. WHERE kitaplar.yv_no = yayinevleri.noifadesiile bu ilişkiyi sorgumuzda kullanmış olduk. Sorgunun çıktısı aşağıdaki gibi olacaktır:
noisimyv_nonoisimsehir
15 dakkada Java11AAnkara
25 bilemedin 6 saatte SQL11AAnkara
3Hakiki SQL22Bİstanbul
Evet bu sonuç kümesi hangi kitabın, hangi yayınevi tarafından basıldığını gösterenanlamlı bir tablo oldu. Aslında bu tablo yukarıdaki 9 satırlı tabloda yv_no ile noalanları eşit olmayan satırlar elenerek elde edildi geri planda. Kısacası tüm veritabanı işlemleri matematiksel fomül ve fonksiyonlara dayanır. İlgilenen arkadaşlar ilişkisel cebir ve ilişkisel hesap konularını inceleyebilirler.
Sorgumuzu aşağıdaki gibi değiştirerek daha sade ve anlaşılır bir sonuç kümesi elde edelim:
SELECT kitaplar.isim, yayinevleri.isim FROM kitaplar, yayinevleri WHERE kitaplar.yv_no = yayinevleri.no
Sonuç kümesi aşağıdaki gibi olacaktır:
isimisim
5 dakkada JavaA
5 bilemedin 6 saatte SQLA
Hakiki SQLB
Şimdi de sorgumuzu öğrendiklerimizden faydalanarak daha okunur hale getirelim.
SELECT K.isim, Y.isim FROM kitaplar K, yayinevleri Y WHERE K.yv_no = Y.no
İşlev açısından yukarıdaki ile tamamen aynı olan sorgumuzu, takma isimlerden (alias) yaralanarak yalnızca sadeleştirdik.
Dersi bir soru ile bitirelim:
Aynı sorguyu neden aşağıdaki gibi yazamazdık?
SELECT isim, isim FROM kitaplar, yayinevleri WHERE yv_no = no

Hiç yorum yok:

Yorum Gönder