KARMAŞIK SORGULAR
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.
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?
Alt sorgunun tanımlanması Sorgu biçimi: SELECT liste FROM tablo WHERE ifade işleç (SELECT liste FROM 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.
Alt sorgu kavramı Örnek: Personel numarası “110” olan personelin ücretinden daha fazla ücret alan personel isimlerini listelemek için: SELECT ADI, ÜCRET FROM PERSONEL WHERE ÜCRET > (SELECT ÜCRET FROM PERSONEL WHERE PERSONEL_NO=110);
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
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
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);
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, ÜCRET FROM PERSONEL WHERE ÜCRET > (SELECT AVG(ÜCRET) FROM PERSONEL);
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 PERSONEL GROUP BY BÖLÜM_NO HAVING MAX(ÜCRET) > (SELECT AVG(ÜCRET) WHERE BÖLÜM_NO=30);