Oracle Ders 30 – SubQueries -01 Single Row SubQuery

Merhaba Arkadaslar,
Bir kac yazi boyunca Oracle da  SubQuery(alt sorgu) konusundan bahsedecegim. SubQuery , nested (icice) sorgu yapisidir.

  • Single Row SubQuery
  • Multiple Row SubQuery
  • Multiple Column SubQuery
  • Correlated SubQuery
  • Uncorrelated SubQuery
  • DML SubQuery
  • Merge Ifadesi

Bu konulari bir kac yazi boyunca sirasiyla isleyecegiz.

Bir subquery nin kendisi tam bir sorgu ifadesi olmalidir. Yani en azindan Select ve From bulunmalidir.
Bir subquery , dis sorgudan yalitilmalidir. Yani parantez kullanilmalidir.

Single Row SubQuery
Single Row yapisi, Subquery sonucunda donen degerin tek oldugu durumda kullanilabilir. Sadece tek bir alan donmelidir.

Where Cumleciginde Single Row SubQuery
Single Row SubQuery yapisini Where cumlecigi ile kullanabiliriz. Asagidaki ornegi dikkatlice inceleyelim.

select cost from books where title = 'DATABASE IMPLEMENTATION';  //31.4
select cost from books where category = 'COMPUTER'; // 31.4 47.25 21.8 37.9

1.sorgu sonucu tek bir sonuc/alan/deger donmektedir.
2.sorgu sonucunda ise 4 adet sonuc/alan/deger donmektedir.

Kitap (books) tablomuzdan maliyeti (cost) , kitap adi (title) DATABASE IMPLEMENTATION olan kitabin maliyetinden (cost) daha fazla olan kitaplari gorelim. Asagidaki sorgumuz ve gelen sonuclari inceleyelim.

select category, title,cost
from books where cost> (select cost
from books where title = 'DATABASE IMPLEMENTATION');

oracle ders 30 single row 1

Bir baska sorgumuz olarak su ornegi calistiralim.

select category, title,cost
from books
where cost> (select cost
from books where category = 'COMPUTER');

ORA-01427: single-row subquery returns more than one row
01427. 00000 – “single-row subquery returns more than one row”

Gordugunuz gibi hata aldik. Cunku kategorisi Computer olan 4 tane kayit var. Bu durumda tek bir deger/alan donmedigi icin Oracle bize hata dondurdu.

Kitap(books) tablosunda bulunan en pahali kitabin adini (title) ogrenmek istiyoruz bu durumda nasil bir sorgu gelir aklimiza ?

select title, max(retail) from books;

ORA-00937: not a single-group group function
00937. 00000 – “not a single-group group function”

Oracle bize yine hata dondurdu. Hatirlayacak olursak burada oldugu gibi title alani ile birlikte group function ( burada max fonksiyonu) kullanilamaz.
Istedigimiz sonucu subquery ile elde edebiliriz.

select title,retail from books
where retail = (select max(retail) from books);

Having Cumlecigi ile Single Row SubQuery
Where cumlecigi ile Single Row SubQuery yapisini kullanabildigimiz gibi Having cumlecigi icerisinde de Single Row SubQuery yapisini kullanabiliriz.

Burada subquery sonucunun yine tek bir alan/deger olarak gelmesi gerekmektedir. Group by sonrasi having yapisinda sartimiz olarak bir subquery kullanabiliriz.
Kategorisi LITERATURE olan kitaplarin ortalama gelirinden(retail-cost) buyuk olan kategorileri gruplayalim.

select avg (retail-cost) from books where category='LITERATURE'; //18.1
select category, avg(retail-cost) "Average Profit"
from books 
group by category
having avg(retail-cost) > (select avg (retail-cost) 
                           from books
                           where category='LITERATURE');

oracle ders 30 single row 2

Select Cumleciginde Single Row SubQuery
Select cumlecigi icerisinde de subquery(alt sorgu) kullanabiliriz. Ornegimizi inceleyelim.

Kitap (books) tablosunda yer alan kitaplarin ortalama satis (retail) fiyati;

select to_char(avg(retail),999.99)from books;  //40.98

Her bir kitabin satis fiyatinin (retail) , ortalama satis fiyatindan farkini gormek istersek;

select title,retail, retail- (select to_char(avg(retail),999.99)
                              from books) 
from books;

oracle ders 30 single row 3

 
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *