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 ile ilişkilidir. Örneğin aşağıdaki Yayinevleri ve Kitaplar tablolarını inceleyelim.
Not: Bu arada diğer SQL derslerine buradan ulaşabilirsiniz
Yayınevleri | Kitaplar | ||||||||||||||||||||||||
|
|
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_no isimli 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 tabloyu join eden) sorgu örneklerine geçelim:
Not: MySQL’i bilgisayarınıza kurup benzer örnekleri bizzat uygulamak isterseniz bu videoyu izleyebilirsiniz.
SELECT * FROM kitaplar , yayinevleri
Sorgunun çıktısı aşağıdaki gibi olacaktır:
no | isim | yv_no | no | isim | sehir |
---|---|---|---|---|---|
1 | 5 dakkada Java | 1 | 1 | A | Ankara |
2 | 5 bilemedin 6 saatte SQL | 1 | 1 | A | Ankara |
3 | Hakiki SQL | 2 | 1 | A | Ankara |
1 | 5 dakkada Java | 1 | 2 | B | İstanbul |
2 | 5 bilemedin 6 saatte SQL | 1 | 2 | B | İstanbul |
3 | Hakiki SQL | 2 | 2 | B | İstanbul |
1 | 5 dakkada Java | 1 | 3 | C | İzmir |
2 | 5 bilemedin 6 saatte SQL | 1 | 3 | C | İzmir |
3 | Hakiki SQL | 2 | 3 | C | İ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.no ifadesiile bu ilişkiyi sorgumuzda kullanmış olduk. Sorgunun çıktısı aşağıdaki gibi olacaktır:
no | isim | yv_no | no | isim | sehir |
---|---|---|---|---|---|
1 | 5 dakkada Java | 1 | 1 | A | Ankara |
2 | 5 bilemedin 6 saatte SQL | 1 | 1 | A | Ankara |
3 | Hakiki SQL | 2 | 2 | B | İstanbul |
Evet bu sonuç kümesi hangi kitabın, hangi yayınevi tarafından basıldığını gösteren anlamlı bir tablo oldu. Aslında bu tablo yukarıdaki 9 satırlı tabloda yv_no ile no alanları 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:
isim | isim |
---|---|
5 dakkada Java | A |
5 bilemedin 6 saatte SQL | A |
Hakiki SQL | B |
Şimdi de sorgumuzu bir önceki derste öğ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
Herkese Kolay Gelsin
08 Mayıs 2010 at 11:20
Güzel bir anlatım, ama birşey sormak istiyorum.
Peki birden fazla tabloyu güncelleştirebilirmiyiz.
Mesela yukardaki tabloda no alan adları aynı olanların ikisini birden güncelleştirebilirmiyiz?
08 Mayıs 2010 at 12:20
Tablolardaki no alan adları ilişkili değil. Yayınevi tablosunun no alanı ile Kitaplar tablosunun yv_no alanı ilişkili.
Yani iki tabloyu bu alanlar üzerinden Join edebiliriz. Aksi halde anlamlı olmaz.
Ancak tek sorgu ile 2 tablo güncellenemez.
20 Mayıs 2010 at 19:11
Anlatım çok açıklayıcı ellerine sağlık..
Yer imlerimden hiç ayrılmıcak bu blog:)
kolay gelsin..
25 Temmuz 2010 at 03:53
Merhabalar,
mysql’de 2 tablo oluşturmak istiyorum,
örneğin 1.tablodaki musterilerden herhangi birinin ürünleri 2.tabloda tutulsun..
A musterisi nin ürünleri kalem,kitap,dergi
B müsterisinin ürünleri tv,laptop..
1.tablodaki ID ye göre 2.tablodaki ürünleri görmek istiyorum.
musteri tablosu urun tablosu
_____________________ _____________
urunID|urunadi
kisiID | musteriler
25 Temmuz 2010 at 12:19
Bahsettiğiniz senaryo 2 değil 3 tablo ile çözülebilir. Müşteri, Ürün ve MüşteriÜrün gibi. Yazıda anlatılan kitap-yazar ilişkisi ile aynı: http://www.hrzafer.com/sql-13-sorguda-birden-fazla-tablo-kullanma-join-2
25 Temmuz 2010 at 03:54
şekil biraz bozuk çıktı..
Merhabalar,
mysql’de 2 tablo oluşturmak istiyorum,
örneğin 1.tablodaki musterilerden herhangi birinin ürünleri 2.tabloda tutulsun..
A musterisi nin ürünleri kalem,kitap,dergi
B müsterisinin ürünleri tv,laptop..
1.tablodaki ID ye göre 2.tablodaki ürünleri görmek istiyorum(çok önemli)
musteri tablosu urun tablosu
_____________________ _____________________
kisiID | musteriler urunID | urunAdi
——-|————- ———|———-
17 Ağustos 2010 at 02:38
merhaba anlatımınız güzel olmuş bilgileriniz için tşk ederim yalnız birşey sormak istiyorum inner joinle bağlantı yaptıktan sonra diyelim ki şehire göre arama yaptıracaksınız bunu nasıl ekleriz yayinevleri.sehir =:’sorgu’ bunun gibi birşeyi
20 Nisan 2013 at 08:19
tabloları kodlarla oluşturmak istiyorum . Yardımcı olabilir misiniz?
21 Nisan 2013 at 07:06
Kitap veritabanının kodları yok. Ama çalışmak için daha iyi olduğunu düşündüğüm örnek okul veritabanının kodları var. Tavsiye ederim: http://www.hrzafer.com/sql-17-ornek-okul-veritabani
24 Nisan 2013 at 18:18
Aynı sorguyu neden aşağıdaki gibi yazamazdık?
“SELECT isim, isim FROM kitaplar, yayinevleri WHERE yv_no = no”
İki adet isim tablosu istiyoruz K.isim
yazdığımızda “from kitaplar K,..” Kitapların isim column cek demek istiyor hem kısaltma olarak isimize yarıyor. eger ki isim isim yazdıgımzda hata alıcaktık veya kitaplar.isim yazmamız gerekicekti dimi hocam yanlıs anlamadım 🙂
25 Nisan 2013 at 01:54
Evet sanırım doğru anlamışsın 🙂 Hem yayınevi tablosunda hem de kitap tablosunda isim alanı var. “Select isim FROM kitap, yayınevi” dediğimizde hangi tablodan çekeceğini bilemez sistem. Bu belirsizliği ortadan kaldırmak için yapıyoruz bunu.
20 Haziran 2013 at 01:29
Merhaba,
Öncelikle hazırladığınız tüm dersler çok güzel olmuş, örnekler basit anlaşır açık.İnşallah devamı da gelir.
Bu sayfada yer alan örnekleri uygulamak istemiştim. Aşağıda ki sorunla karşılaştım. Yardımcı olabilir misiniz?
Yayınevlerine ait tablo için, veri tiplerini tanımlarken;
no (tinyint, null)
isim (char(10), null)
sehir(char(20),null)olarak oluşturdum,verilerini girdim ve herhangi bir uyarı almadım. Fakat Kitaplar tablosu için, veri tiplerini;
No (tinyint,null)
isim (char(10), null)
yv_no (tinyint, null)olarak oluşturdum, tablo üzerinde daha ilk satırın son kolonunda ki veriyi girip “Enter” tuşuna bastım ki karşıma şöyle bir mesaj çıktı.
“The data in row1 was not committed.
…
ErrorMessage: String or binary data would be truncated.
The statement has been terminated.
Correct the errors and retry or press ESC to cancel the change(s).
Bundan sonra veri tiplerini şöyle değiştirdim.
No (nvarchar(10), null)
isim (char(10), null)
yv_no (nvarchar(10), null)
Fakat aynı sorun yine oldu. tinyint veri tipinin “No” ve “yv_no” için en azından burada yer alan örnekler adına yeterli olabileceğini düşünmüştüm. Bu sorununla karşılaşmamak için ne yapmalıyız? Bu sorunu nasıl çözebiliriz?
Yardımlarınız için şimdiden teşekkür ederim.
20 Haziran 2013 at 02:37
Öncelikle yayınevi girişi yapmalısın.
20 Haziran 2013 at 10:19
Tamam zaten bende ilk önce yayınevine ait verileri girdim… Ama aklıma bir şey geliyor,siz burada konu içersinde bahsetmemişsiniz ama birincil anahtar (primary key), yabancı anahtar (foreign key)tanımlaması yapılması gerekiyor muydu? Bu konudaki örneğin içeriğine bakınca, kendimce gerekli değil gibi gördüm ama bilemiyorum ?
20 Haziran 2013 at 23:02
Bugün her iki tabloyu da silip, yeniden şu sırada yaptım ve çalıştı.:)
Bu kez yayınevleri veri tiplerini oluşturduktan hemen sonra ona ait verileri girdim. Sonra kitaplar tablosunun veri tiplerini tanımlayıp, verilerini girdim. Sorun ortadan kalktı.
(Daha önce ilk önce her iki tablonunda veri tiplerini oluşturduktan sonra ilk önce yayınevi, sonra kitaplar şeklinde verilerini girmek istemiştim, ama yukarıda da bahsettiğim gibi olmamıştı.)
Neden öncelikle yayınevi girişi yapmamız gerektiğini anlayamadım ama? Aslında her iki tablo da oluşurken, bir birinden bağımsız oluşmuyor mu?
26 Eylül 2017 at 05:41
Çok başarılı bir anlatım, teşekkürler.
28 Aralık 2018 at 01:57
Çok güzel açıklamışsınız emeğinize sağlık,teşekkürler