SQL'de Birden Fazla Tablodan Listeleme Yapmak
Excel DüşeyAra (VLookUp) fonksiyonlarında olduğu gibi, veritabanı tabloları arasında ilişki kurup liste veya rapor oluşturmak istiyorum.
Ogrenciler isimli bir ana tablom ve Kisiler isimli bir yardımcı tablom olsun. İki tablo arasında ortak kolonum KisiID kolonudur. Bu ortak kolon aracılığıyla Kisiler tablosundan KisiAdi ve KisiSoyadi bilgilerini getirteceğim. Ana tablom olan Ogrenciler tablosundan da OgrenciNo bilgisini görmek istiyorum. Önce Select cümlemizi görelim:
Select
OgrenciNo, KisiAdi, KisiSoyadi
from Ogrenciler o
left join Kisiler k on k.KisiID = o.KisiID
OgrenciNo, KisiAdi, KisiSoyadi
from Ogrenciler o
left join Kisiler k on k.KisiID = o.KisiID
Yukarıda yazdıklarımızın ne olduklarını anlayalım:
Select cümlesinde bu amaçla tablo olarak önce ana tablomu yazıyorum.
Yazış sırama göre ana tablo solda kaldığı için bağlanırken "soldakini esas al" anlamında Left Join yapıyorum.
Left Join terimlerini yazdıktan sonra hangi tabloya bağlanacaksam o tablonun adını belirtiyorum.
Tablo adından sonra hangi kolonlar üzerinden bağlantı kuracağımı belirtiyorum.
Kolon adları iki tabloda da aynı isimli ise, bu kolonların isimlerinin önünde tabloların takma adlarını kullanıyorum. Takma ad, Ogrenciler tablosu için o, Kisiler tablosu için k harfleridir.
Takma ad ile kolon adı arasına nokta işareti koyuyorum.
Excel DüşeyAra fonksiyonunda bilgi getirilecek her kolonda tek tek DüşeyAra yapılıyor. SQL'de ise bir kere bağlantı yapıldıktan sonra bağlantı yapılan tablolardan istenen kolon adlarının yazılması yeterli olmaktadır.
Yukarıdaki listeleme işleminin sonucu aşağıdadır:
İkinci örnek olarak, bir Sınavlar isimli ana tablomuz ve Dersler isimli yardımcı tablomuz olsun. Bu iki tablo arasında ortak kolon DersID kolonudur. Dersler tablosundan DersAdi bilgisini, ana tablo olan Sinavlar tablosundan ise SinavTarihi, SinavTipiKodu ve SinavSiraNo bilgilerini göstermemiz yeterlidir.
Bu tablolar arasında yazılacak Select cümlesini, yukarıdaki örnekte olduğu gibi yazalım:
Önce ana tablo olan Sinavlar tablosunu from teriminden sonra yazıyorum.
Bu tabloya bir takma ad olarak s harfini kullanacağım.
Yardımcı tablo olan Dersler tablosunu Left Join teriminden sonra yazıp bu tabloya da d harfini takma adı olarak tanımlayacağım. Takma adları anımsatıcı olacak şekilde belirliyorum.
Select
DersAdi, SinavTarihi, SinavTipiKodu, SinavSiraNo
from Sinavlar s
left join Dersler d on d.DersID = s.DersID
DersAdi, SinavTarihi, SinavTipiKodu, SinavSiraNo
from Sinavlar s
left join Dersler d on d.DersID = s.DersID
Sorgu sonucu:
Sinavlar ve Ogrenciler tablolarımız mevcut.
Bu tablolarımızı birer yardımcı tablo olan SinavNotlari isimli bir de ana tablomuz olsa.
Bu tabloda da bir öğrencinin bir sınavdan kaç not aldığı yazsa.
Bu ana tablodan yardımcı tablolara bağlanırız, Öğrenci ve Sınav bilgilerini elde ederiz.
Bu yardımcı tabloların yardımcı tabloları olan tablolara yukarıda bağlandığımız gibi bağlanıp, bu ikinci dereceden yardımcı tablolardan da Kişi ve Ders bilgilerini elde ederiz.
Sonuç olarak Öğrenci, Kişi, Sınav, Ders bilgileri ile birlikte Ders Notunu listeleyebiliriz.
SinavNotlari ana tablosuna da sn takma adı verelim.
Tablolar arasındaki ilişki şeması aşağıdaki gibidir. Şemada tablolar arası bağlantı kolonları tablo isimleri arasına yazılmıştır. Tabloların takma adları da, tablo adlarının yanına yazılmıştır. Left Join yönleri de şemada okla gösterilmiştir.
Bu şekilde yazılacak Select cümlesi ve sonucu aşağıdadır:
Select
DersAdi, SinavTarihi, SinavTipiKodu, SinavSiraNo, OgrenciNo, KisiAdi, KisiSoyadi, SinavNotu
from SinavNotlari sn
left join Sinavlar s on s.SinavID = sn.SinavID
left join Dersler d on d.DersID = s.DersID
left join Ogrenciler o on o.OgrenciID = sn.OgrenciID
left join Kisiler k on k.KisiID = o.KisiID