MySQL , özellikle web tabanlı projelerdeki popüleritesini her geçen gün biraz daha arttırıyor. Başlangıçta son derece basit veritabanı özelliklerini içeren MySQL yeni versiyonları ile beraber gittikçe kapsamlı bir veritabanı olmaya başladı. Yeni versiyonların en çok sevilen yada sevileceği tahmin edilen özelliklerinden birisi de SUBQUERIES (alt sorgular) Bir süredir konuşulan bu özellik MySQL'in 4.1 sürümü ile nihayet ortaya çıktı.
"Subquery"ler (yazının bundan sonraki kısmında "alt sorgular" olarak bahsedilecek) isimlerinden de anlaşıldığı gibi diğer sorguların içerisinde çalışırlar. "Alt sorgu"ların nasıl çalıştığını şimdi bir örnek ile görelim.
Aşağıdaki veritabanı tablosunun adı "ogrenci" olsun ve bir sınıftaki öğrencilerin isimleri kayıtlı olsun.
| Ogrenci_ID |
Ogrenci_Isim |
Ogrenci_Soyisim |
| 104 |
Ahmet |
Ulvi |
| 105 |
Sibel |
Tokgöz |
| 108 |
Cemal |
Berke |
| 111 |
Deniz |
Altuğ |
Aşağıdaki veritabanın adı da "dersler" olsun ve derslerin ID numaraları ile isimleri ve o derslere giren öğretmenlerin isimleri yer alsın.
| Ders_ID |
Ders_ADI |
Ders_Ogretmen |
| 1025 |
Makine Elemanları |
Necati Dogur |
| 1026 |
Pnömatik Sistemler |
Selma Salman |
Aşağıdaki veritabanının adı da "basarisizlar" olsun ve bu tabloda alttan alınan dersler ile ilgili bilgiler yer alsın.
| BasarisizDers_ID |
Ders_ID |
Ogrenci_ID |
| 311 |
1025 |
104 |
| 312 |
1025 |
105 |
| 313 |
1025 |
108 |
| 314 |
1026 |
108 |
Şimdi 108 ID numaralı Cemal Berke adındaki öğrencinin başarısız olduğu dersleri MySQL'e listeletmeye çalışalım.
mysql > select Ders_ADI from dersler where Ders_ID=(select Ders_ID from basarisizlar where Ogrenci_ID=108)
| Ders_ADI |
| Makine Elemanları |
| Pnömatik Sistemler |
Bu tür ifadelerde en can alıcı nokta parantezler içerisinde belirttiğimiz alt sorgu içerisinde sadece bir adet sütun adını kullanmamızdır. Şöyle bir örnek hata verecektir.
mysql > select Ders_ADI from dersler where Ders_ID=(select Ders_ID,Ogrenci_ID from basarisizlar where Ogrenci_ID=108)
ERROR 1239: Cardinality error (more/less than 1 columns)
Birden fazla alt sorguyu içiçe olarak da kullanabilirsiniz. Yukarıdaki örnekte Cemal Berke adındaki öğrencinin ID numarasını bilmediğimiz varsayarak yeni bir SQL cümlesi oluşturalım.
mysql > select Ders_ADI from dersler where Ders_ID=(select Ders_ID from basarisizlar where Ogrenci_ID=(select Ogrenci_ID from ogrenciler where Ogrenci_Isim='Cemal' AND Ogrenci_SoyIsim='Berke'))