SQL'de Alt Sorgu
Bir sorgunun içinden başka bir sorgu kullandığımızda bu içteki sorguya alt sorgu anlamında Subquery adı verilmektedir. Bir Subquery örneği görelim:
Select
OgrenciNo,
(select KisiAdi + ' ' + KisiSoyadi from Kisiler
k where k.KisiID = o.KisiID) as “Adı
Soyadı”
from Ogrenciler o
Alt sorguda okuduğu KisiAdi ve KisiSoyadi bilgilerini
aralarına boşluk karakteri ekleyerek yan yana getirmektedir.
Bu alt sorgu yerine aslında left join kullanılır, fakat Alt Sorgu örneği olsun diye bu şekilde
kullandık. Bu sorgu, Kişi Adı ve Soyadını Kişiler tablosundan bir alt sorguyla
okumaktadır.
Left Join cümleciğinde kullandığımız ‘on’ yerine burada ‘where’
kullanıyoruz, çünkü normal bir Select
işlemi yapıyoruz. Bu Select cümlesinin ‘where’ koşul cümleciğiyle istediğimiz kaydı
bulduruyoruz.
Bulduğumuz sonucunun bir kolon adı olmadığından, takma ad
olarak örneğin “Adı Soyadı” ismini kullanıyoruz.
Alt sorgudaki koşul cümleciğinde eşittir işaretinin sol
tarafında Kisiler tablosuna ait KisiID kolonu ve sağ tarafında ise Ogrenciler
tablosuna ait KisiID kolonu bulunmaktadır. Aynı anda bağlanılmış olan iki
tabloda da aynı isimli kolon olduğundan, programa bu kolonlardan soldakinin
hangi tabloya ve sağdakinin hangi tabloya ait olduğunu söylemek amacıyla kolon
adlarının önüne belirteç olarak tabloların takma adlarını yazdık. Sorguda
görüldüğü gibi Ogrenciler tablosu için ‘o’ ve Kisiler tablosu için ‘k’ takma
adlarını tanımladık.
Alt sorgu yerine Left Join kullanmak çok daha iyidir. Hem
hız kazandırır. Hem de bir bağlantıyla birden fazla kolondan bilgi
getirilebilir. Alt sorguda ise, her kolon için tek tek sorgu yazmak
gerekecektir ya da okunan birden fazla kolon hepsini yan yana metin
birleştirmesiyle tek kolon olarak gösterilebilecektir. Dolayısıyla bu amaçla
Left Join kullanmanızı tavsiye ederim.
Alt sorgunun bir başka kullanımı, bir koşul cümleciğinde
eşittir işaretinin sağ tarafına bir değer getirtmek içindir. Aşağıdaki örneğimizi
inceleyelim:
select
OgrenciNo
from Ogrenciler o
where KisiID = (select KisiID from
Kisiler where KisiAdi='Ahmet' and KisiSoyadi
= 'Yılmaz')
Bu örnekte Kisiler tablosuna bir Left Join kullanarak
bağlanılmamıştır. Dolayısıyla istediğimiz kişinin ID numarasını bir alt
sorguyla elde edilip, bu kişinin Ogrenciler tablosundaki istenen kaydı okunabilmiştir.
Bu konuda bir başka örnek görelim:
Select AdiSoyadi, Maasi
from Maaslar
where Maasi = (Select Max(Maasi) from Maaslar)
Buradaki Select cümlesi, Maaslar tablosundaki en yüksek maaşlı kişilerin isimlerini ve maaşı listelemektedir. En yüksek maaş değeri, alt sorguyla bulunmakta ve koşul cümleciğindeki eşittir işaretinin sağ tarafına getirtilmektedir. Listeleme yapan Select cümlesi de Maasi bu değere eşit olanları listelemektedir.