Alt sorgu(Subquery) sorgu içerisinde sorgu demektir.İçte ki alt sorgu problemin bir kısmının çözümünü verir,kalan kısmı ise ana sorguda çözülür.

Örnekle açıklayacak olursak employees tablosunda yer alan verilerden first_name sütunu Nancy olan verinin salary’i sütunundan yüksek olan diğer verileri listele.Burada sorguyu 2 parçaya böleriz birinci parça Nancy’nin salary sütununun değeri ne kadar ,ikinci parça ise hangi verilerin salary sütunu Nancy’den yüksektir.

SELECT * FROM employees
WHERE salary > (SELECT salary FROM employees WHERE first_name='Nancy');
  1. Alt sorguları SELECT cümlelerinin FROM kısmında kullanırsak bu alt sorguya İçsel Görüntü denilir.
  2. Alt sorguları SELECT cümlelerinin WHERE kısmında kullanırsak bu tür alt sorgulara İç İçe alt sorgu denilir.
  3. Eger ana sorgu da kullanılan bir sütun alt sorguda da kullanılırsa buna Korelasyon alt sorgu denilir.Ana sorguda ki her bir kayıt için alt sorgu bir kez çalıştırılır.
  4. Eger alt sorgu sadece bir sütun ve bir kayıt döndürüyorsa bu tür alt sorgulara Doğrusal alt sorgu denir.

Tek Kayıt Döndüren Alt Sorgular

Tek kayıt döndüren alt sorgular da alt sorgudan ana sorguya tek kayıt döner. Tek kayıt döndüren alt sorgular da alt sorgu ile ana sorgu birleştirilirken eşittir (=,; vb.) operatörler kullanılır.

  • Aşagıda ki örnekte alt sorgu(içteki sorgu) ile ilk başta employees tablosun daki salary sütununda olan kayıtlardan degeri en yüksek olan kayıtı ana sorguya dönderir ve daha sonra ana sorgu da salary sütununda ki kayıtlardan,altsorgu ile dönen degere eşit kayıtları dönderir.
SELECT * FROM employees
WHERE salary = (SELECT max(salary) FROM employees);

NOT :    Tek kayıt döndüren alt sorgularda alt sorgu tek kayıt döndürmesine karşın ana sorgu birden fazla kayıt döndürebilir.

  • Aşagıda ki örnekte alt sorgu(içteki sorgu) ile ilk başta employees tablosun daki salary sütununda ki kayıtların ortalamasını dönderir ve daha sonra ana sorgu da salary sütununda ki kayıtlardan,altsorgu ile dönen degerden büyük kayıtları dönderir.
SELECT * FROM employees
WHERE salary > (SELECT avg(salary) FROM employees);
  • Aşagıda ki örnekte alt sorgu(içteki sorgu) ile departments tablosunda department_name sütunun daki Sales verisinin department_id verisini döndürür,daha sonra da employees tablosunda ki department_id sütununda bulunan kayıtlardan,altsorgu sonucu dönen department_id sütunu aynı olan kayıtların bilgilerini döndürir.
SELECT * FROM employees WHERE department_id =
(SELECT department_id FROM departments WHERE department_name='Sales');

Çoklu Kayıt Döndüren Alt Sorgular

Çok kayıt döndüren alt sorgular da alt sorgudan ana sorguya birden fazla kayıt döner.Çoklu kayıt sorgularını ana sorgu ile birleştirirken IN,ANY,EXISTS,ALL vb. operatörler kullanılır.

  • Aşagıda ki örnekte altsorgu ile employees tablosunda first_name sütunun da Alexander olan kayıtların department_id’leri ana sorguya dönülür.Ana sorguda ise altsorguda ile dönen kayıtlardan lsitede olanlar dönerler.
SELECT * FROM employees WHERE department_id IN
(SELECT department_id FROM employees WHERE first_name='Alexander' );
  • Örnekler ;
SELECT * FROM employees WHERE department_id NOT IN
(SELECT department_id FROM employees WHERE first_name='Alexander' );
SELECT * FROM employees WHERE salary > ANY
(SELECT salary FROM employees WHERE first_name='John' ) ;
SELECT * FROM employees WHERE salary > ALL
(SELECT salary FROM employees WHERE first_name='John' ) ;
SELECT * FROM employees WHERE salary > SOME
(SELECT salary FROM employees WHERE first_name='John' ) ;
SELECT first_name,department_id FROM employees e WHERE EXISTS
( SELECT 1 FROM departments d
WHERE d.department_id = e.department_id AND d.department_name = 'Sales');

NOT : Alt sorgunun tek kayıt mı yoksa birden fazla kayıt mı döndüreceğinden emin değilsek tek kayıt operatörleri yerine çoklu kayıt operatörleri kullanmak daha uygun olur.

SELECT * FROM employees WHERE department_id =
(SELECT department_id FROM departments WHERE department_name='Sales');
SELECT * FROM employees WHERE department_id IN
(SELECT department_id FROM departments WHERE department_name='Sales');

Korelasyon Alt Sorgular

Alt sorguda ana sorguda ki bir sütuna referans gösterilmişse bu tür sorgulara korelasyon altsorgular denir.Bu tür sorgular da ana sorguda ki her bir kayıt için alt sorgu çalıştırılır.

  • Aşagıda ki örnekte altsorgu da(e2.department_id = e1.department_id) anasorgudan referans gösterilmiştir.(employees e1)
SELECT e1.first_name,department_id,salary FROM employees e1
WHERE salary > (SELECT AVG(e2.salary) from employees e2
WHERE e2.department_id = e1.department_id);

NOT : Korelasyon sorgular da ana sorguda kullanılan sütunlara alt sorguda referans verilerek kullanılabilir ancak alt sorguda kullanılan sütunlara ana sorguda referans verilemez.

Doğrusal Alt Sorgular

Dogrusal alt sorgular tam olarak bir sütuna sahip bir kayıt döndüren sorgulardır.Doğrusal alt sorgular tek kayıt fonksiyonlarına benzer şekilde kullanılırlar.INSERT cümlelerinin VALUES kısmında,SELECT cümlelerinin ORDER BY ve WHERE kısmında ya da CASE ifadelerin de kullanılabilir.Dogrusal alt sorgular GROUP BY ve HAVING kısımların da kullanılamaz.

  • Aşagıda ki örnekte employees tablosunda ki first_name,salary sütunu ve bunun yanında dogrusal altsorgu sayesinde her department’deki en yüksek salary’iyi verecek.
SELECT first_name,salary,
(SELECT max(salary) from employees e2 WHERE e2.department_id=e1.department_id)
from employees e1;

NOT : Dogrusal alt sorgular birden fazla kayıt döndürürse ana sorguda hata alınır.Eger alt sorgu hiç kayıt döndürmez ise değeri NULL olur.

Çok Sütunlu Alt Sorgular

Alt sorgunun SELECT kısmın da birden fazla yer sütun yer alıyorsa bunlara çok sütunlu alt sorgular denilir.

  • Aşagıda ki örnek te alt sorgudan ana sorguya 2 sütunun kayıtları döner ve karşılaştırma da bu 2 sütuna göre yapılır.
SELECT first_name,department_id,salary FROM employees
WHERE (department_id,salary) IN
(SELECT department_id,MAX(salary) FROM employees GROUP BY department_id );
NOT  : Örneklerimde Oracleda ki DUAL table ’ ı ve HR user ’ ı kullanıyorum.
Yararlı olması Dilegiyle…
Yazar : Mustafa Bektaş Tepe
Java && Oracle

17,312 total views, 2 views today