VERĐTABANI YÖNETĐM SĐSTEMLERĐ Öğr.Gör.Sedat Telçeken ANADOLU ÜNĐVERSĐTESĐ FEN FAKÜLTESĐ MATEMATĐK BÖLÜMÜ 2005 2006 Bahar Dönemi KARMAŞIK SORGULAR ALT SORGU: Sorgu esnasında; bir sorgudan elde edilen bir sonuç, başka bir sorguda kullanılabilmektedir. Bu gibi sorgulara alt sorgular(iç sorgular) denir. ÖRNEK: Hangi öğrencinin notu, Özlem isimli öğrencinin notundan daha fazladır? Öncelikle, Özlem isimli öğrencinin notunu bulmalı, daha sonra ise bu nottan daha yüksek olan öğrencileri bulmalı. SELECT Adı, Notu WHERE Notu > (SELECT Notu WHERE Adı = Özlem ); 1
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 arasında yer alır. Alt sorgu ORDER BY içermez. Bu sözcük sadece ana sorgu içerisinde yer alabilir. Alt sorgularda iki tür karşılatırma işleci Tek satır işleçleri Çoklu satır işleçleri bulunabilir. Tek satır alt sorguları Sadece bir değer döndüren alt sorgulardır. =, >, >=, <, <=, <> ÖRNEK: SELECT Adı, Memleketi WHERE Memleketi = (SELECT Memleketi WHERE Öğrenci_No = 201654); 2
Tek satır alt sorguları ÖRNEK: Öğrenci numarası 201654 olan öğrenciyle aynı memleketli olan ve 301987 numaralı öğrenciden daha çok not alan öğrencileri sorgulamak istiyoruz: SQL> SELECT Adı, Memleketi, Notu WHERE Memleketi = (SELECT Memleketi WHERE Öğrenci_No=201654) AND Notu > (SELECT Notu WHERE Öğrenci_No=301987); Grup fonksiyonları kullanımı Grup fonksiyonları sadece bir değer döndürdüğü için, bu tür fonksiyonlar tek satır alt sorgularda kullanılır. ÖRNEK: SELECT Adı, Notu WHERE Notu = (SELECT MIN(Notu) ); Benzer şekilde not örneği için AVG fonksiyonu da kullanılabilir. 3
HAVING kullanımı Ana sorguda grup fonksiyonu varsa, grup koşullarıda tanımlanacaktır. Bu durumda HAVING sözcüğü kullanılır. SELECT liste FROM tablo GROUP BY sütun HAVING fonksiyon işleç (SELECT fonksiyon FROM tablo); HAVING kullanımı ÖRNEK: En düşük ücreti 20 numaralı bölümün en düşük ücretinden daha büyük bölümleri listemek istersek; SQL> SELECT Bölüm_No, MIN(Ücret) AS En Az Ücret GROUP BY Bölüm_No HAVING MIN(Ücret) > (SELECT MIN(Ücret) WHERE Bölüm_No=20); 4
HAVING kullanımı ÖRNEK: En fazla ücret alan personelin ücreti 30 numaralı bölümün ortalama ücretinden daha fazla olan bölümleri listelemek istersek; SQL> SELECT Bölüm_No, MAX(Ücret) AS En Yüksek Ücret GROUP BY Bölüm_No HAVING MAX(Ücret) > (SELECT AVG(Ücret) WHERE Bölüm_No=30); Alt sorgularda hatalar Tek satır alt sorgularında, alt sorgu birden fazla değer üretmemelidir. SQL> SELECT Personel_No,Adı WHERE Ücret = (SELECT MIN(Ücret) GROUP BY Bölüm_No); Yukarıdaki sorgu hatalıdır, çünkü alt sorgudan birden fazla satır listeleyecektir. Ana sorgudaki = işleci sadece bir satıra göre işlem yapacağından sonuç alınamayacaktır. 5
Çoklu satır alt sorguları Alt sorgulardan birden fazla satır elde ediliyorsa bu kez sorgu çoklu satır alt sorgusu olmaktadır. IN : Liste içindeki değerlerden seçme işlemini yapar ANY : Alt sorgu tarafından döndürülen her bir değer için karşılatırma işlemini gerçekleştirir. ALL : Alt sorgu tarafından döndürülen tüm değerlerle karşılaştırma işlemi gerçekleştirilir. IN işleci ÖRNEK :Her bölümdeki en az ücretleri belirleyerek bunlarla aynı ücreti alan personeli görüntelemek için; SQL> SELECT Personel_No,Adı WHERE Ücret IN (SELECT MIN(Ücret) GROUP BY Bölüm_No); 6
ANY işleci Alt sorgu tarafından üretilen her bir değeri ana sorgu içinde belirlenen bir değerle karşılatırmak sözkonusu ise kullanılır. ( =, <, >) ile birlikte kullanımı sözkonusudur. ÖRNEK : En fazla kazanan MEMUR dan daha az maaşı olan personeli listelemek istersek; SQL> SELECT Adı, Ücret, Görevi WHERE Ücret <ANY (SELECT Ücret WHERE Görevi = MEMUR ); ANY işleci ÖRNEK : En düşük ücretli MEMUR dan daha fazla maaşı olan personeli listelemek istersek; SQL> SELECT Adı, Ücret, Görevi WHERE Ücret >ANY (SELECT Ücret WHERE Görevi = MEMUR ); 7
ALL işleci Alt sorguda üretilen tüm değerlerin, ana sorgu için bir girdi olarak kullanılması sözkonusu ise kullanılır. >ALL : en büyükten daha büyük <ALL : en küçükten daha küçük ÖRNEK : Ücreti tüm bölümlerin ortalama ücretinden daha büyük olan personeli listelemek istersek; SQL> SELECT Adı, Ücret 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şula bağlı olarak bunların girdi olarak kullanılması sözkonusudur. ÖRNEK : Đrfan isimli öğrenciyle aynı bölümde ve aynı notu alan öğrenciyi listelemek istersek; SQL> SELECT Öğrenci_No, Adı, Notu WHERE (Bölüm, Notu) IN (SELECT Bölüm, Notu WHERE Adı = Đrfan ); Ancak bu sorgudan Đrfan ın bilgileri de gelecektir. Bu bilgiler dahil edilmek istenmiyorsa; Sonuna AND Adı <> Đrfan ; eklenmelidir. 8
Çok sütunlu alt sorgular ÖRNEK : Ahmet isimli personel ile aynı yıl işe giren ve görevi Ahmet ile aynı olan personel olup olmadığını öğrenmek istersek; SQL> SELECT Adı, Görevi, Giriş_Tar AS GĐRĐŞ TARĐHĐ WHERE (Görevi,TO_CHAR(Giriş_Tar, YYYY )) IN (SELECT Görevi, TO_CHAR(Giriş_Tar, YYYY ) WHERE Adı = Ahmet ); FROM içinmde Alt Sorgu ÖRNEK : Bir bölümün ortalama ücretinden daha fazla ücret alan tüm personelin ortalama ücretlerini listelemek istersek; SELECT P.Bölüm_No, P.Adı, P.Ücret, S.Maaş P, (SELECT Bölüm_No, AVG(Ücret) AS Maaş GROUP BY Bölüm_No) S WHERE P.Bölüm_No = S.Bölüm_No AND P.Ücret > S.Maaş; 9