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=3000);
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);
Havıng 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);
Çoklu satır alt sorgusu Alt sorgudan bir satır yerine, daha fazla sayıda satır elde ediliyorsa, bu kez sorgu bir çoklu alt sorgusu olarak değerlendirilir. İşleç Anlamı IN liste içindeki değerlerden seçme işlemini gerçekleştirir. ANY alt sorgu tarafından döndürülen her bir değer için karşılaştırma işlemini gerçekleştirir. ALL alt sorgu tarafından döndürülen tüm değerlerle karşılaştırma işlemini gerçekleştirir.
IN İŞLECİ Bir liste içindeki değerlerden birini seçmek için IN işlecini kullanıyorduk. Örnek: Her bölümdeki en az ücretleri belirleyerek, bunlarla aynı ücreti alan personeli görüntülemek için: SELECT ADI, ÜCRET, BÖLÜM_NO FROM PERSONEL WHERE ÜCRET IN( SELECT MIN(UCRET) GROUP BY BÖLÜM_NO);
ANY İŞLECİ Alt sorgu tarafından üretilen her bir değeri ana sorgu içinde belirlenen bir değer ile karşılaştırmak söz konusu ise ANY işleci kullanılır. Bu işleç “=,<,>” işleçlerinden biri ile birlikte kullanılır. “=ANY” biçimindeki bir tanım IN tanımı ile eşdeğerdir. “<ANY” ifadesi en çoktan daha az “>ANY” ifadesi en azdan daha büyük anlamında değerlendirilir.
ANY İŞLECİ Örnek: En fazla kazanan MEMUR dan daha az maaşı olan personeli listelemek için: SELECT ADI, ÜCRET, GÖREVİ FROM PERSONEL WHERE ÜCRET <ANY ( SELECT ÜCRET WHERE GÖREVİ=‘MEMUR’);
ALL İŞLECİ Alt sorgu tarafından üretilen tüm değerlerin, ana sorgu için bir girdi olarak kullanılması söz konusu ise ALL işleci kullanılabilir. “>ALL” ifadesi en büyükten daha büyük “<ALL” ifadesi en küçükten daha küçük olanları ifade eder.
ALL İŞLECİ Örnek: Ücreti tüm bölümlerin ortalama ücretinden daha büyük olan personeli listelemek için: SELECT ADI, ÜCRET FROM PERSONEL WHERE ÜCRET >ALL ( SELECT AVG(ÜCRET) GROUP BY BÖLÜM_NO);
Çok sütunlu alt sorgular Bazı uygulamalarda alt sorgunun birden fazla sütun üretmesi ve koşul içinde bu değerlerin kullanılması söz konusu olabilir. Örnek: SEZİN isimli personelin görevi ve ücretiyle aynı olan personeli listelemek için: SELECT BÖLÜM_NO, ADI, ÜCRET FROM PERSONEL WHERE (GÖREVİ,ÜCRET) IN (SELECT GÖREVİ, ÜCRET WHERE ADI=‘SEZİN’);
From sözcüğü içinde alt sorgu tanımlama Normal olarak bir SELECT deyiminde kullanılabilecek tablolar, yani veri kaynağı FROM sözcüğü içinde tanımlanır. Ancak gerektiğinde bir alt sorgunun sonuçları da tıpkı bir tablo gibi değerlendirilerek, FROM içinde bu sorgu yer alabilir. Örnek: Bir bölümün ortalama ücretinden daha fazla ücret alan tüm personelin ortalama ücretlerini listelemek için: SELECT P.BÖLÜM_NO, P.ADI, P.ÜCRET, S.MAAŞ FROM PERSONEL P, (SELECT BÖLÜM_NO,AVG(ÜCRET) AS MAAŞ) FROM PERSONEL GROUP BY BÖLÜM_NO S WHERE P.BÖLÜM_NO=S.BÖLÜM_NO AND P.ÜCRET>S.MAAŞ;