2 Alt sorgu kavramıKarmaşık sorgular, bir sorgu içinde birden fazla SELECT deyiminin kullanılması ile elde edilir. Karmaşık sorgularda, ana sorgu bir başka alt sorgudan elde edilen sonuçları kullanır.Uygulamada, bir sorgudan elde edilen sonuç, diğer bir sorguyu ilgilendirebilir. Bu gibi durumlarda alt sorgular (iç sorgular) kullanılır.
3 Alt sorgu kavramıÖrnek: “Hangi personelin ücreti “HALİT” isimli personelin ücretinden daha fazladır?” bu problemi iki farklı sorguya ayırmak mümkündür. Sorgu1. “HALİT” isimli personelin aylık ücreti nedir? Sorgu2. Hangi personelin ücreti “HALİT” isimli personelin ücretinden daha fazladır?
4 Alt sorgunun tanımlanması Sorgu biçimi:SELECT listeFROM tabloWHERE ifade işleç(SELECT listeFROM tablo)Tanımda görüldüğü gibi, iki SELECT deyimi ile bir farklı sorgu tanımlanmıştır. Bu iki sorgu birbirine WHERE koşul sözcüğü içinde bağlanmıştır. Bir alt sorgu WHERE, HAVING, FROM sözcükleri içinde kullanılabilir.
5 Alt sorgu kavramıÖrnek: Personel numarası “110” olan personelin ücretinden daha fazla ücret alan personel isimlerini listelemek için:SELECT ADI, ÜCRETFROM PERSONELWHERE ÜCRET >(SELECT ÜCRET FROM PERSONELWHERE PERSONEL_NO=110);
6 Alt sorgu düzenleme kuralları Alt sorgu, ana sorgu içindeki karşılaştırma işlecinin sağında yer almalıdır. FROM sözcüğü içinde tanımlanan sorgular bu kuralın dışındadır.Bir alt sorgu parantez işaretleri içinde yer almalıdır.Alt sorgu ORDER BY sözcüğü içeremez. Bu sorgu sadece ana sorgu içinde yer alabilir.Alt sorgularda iki tür karşılaştırma işleci bulunabilir: a) Tek satır işleçleri b) Çoklu satır işleçleri
7 Tek satır alt sorguları Sadece bir değer döndüren alt sorgulardır. İç taraftaki SELECT deyiminden sadece tek bir değer elde edilir.İşleç Anlamı= eşit> büyük>= büyük veya eşit< küçük<= küçük veya eşit<> eşit değil
8 Tek satır alt sorguları Örnek: Personel numarası “155” olan personelle aynı göreve sahip olan ve “300” numaralı personelin ücretinden daha fazla ücret alan personeli listelemek istiyoruz. SELECT ADI, GÖREVİ, ÜCRET FROM PERSONEL WHERE GÖREVİ= (SELECT GÖREVİ WHERE PERSONEL_NO=155) AND ÜCRET> (SELECT ÜCRET WHERE PERSONEL_NO=300);
9 Grup fonksiyonlarının kullanımı Grup fonksiyonları sadece bir değer döndürdüğü için, bu tür fonksiyonlar tek satır alt sorgularında kullanılabilir.Örnek: Personel arasında ortalama ücretten daha fazla ücret alanları listelemek için:SELECT ADI, ÜCRETFROM PERSONELWHERE ÜCRET >(SELECT AVG(ÜCRET)FROM PERSONEL);
10 Having ile grup koşullarının tanımlanması Ana sorgu grup fonksiyonu içeriyorsa, doğal olarak grup koşullarının tanımlanması gerekebilecektir. Yani HAVING sözcüğü de kullanılacaktır.Örnek: En fazla ücret alan personelinin ücreti, “30” numaralı bölümün ortalama ücretinden daha fazla olan bölümleri öğrenmek için:SELECT BÖLÜM_NO, MAX(ÜCRET) AS “EN YÜKSEK ÜCRET”FROM PERSONELGROUP BY BÖLÜM_NOHAVING MAX(ÜCRET) >(SELECT AVG(ÜCRET)WHERE BÖLÜM_NO=30);