Oracle Database — SQL Temelleri 8 — Alt Sorgular

Arkadaşlar Merhaba,

Alt Sorgu (subquery) sorgu içinde sorgu demektir. Konuyu örneklerle pekiştirelim.

Alt Sorgu Syntax:

SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

Örnek:

SELECT last_name, salary
FROM employees
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Lee');

İsmi Lee olan kişinin maaşından daha yüksek maaş alanları alt sorgu kullanarak listeledik.

oracle-sql-8-1

Alt Sorgu Çeşitleri

Alt sorgular tek ve çoğul kayıt döndürmek üzere 2 gruba ayrılır.

Tek kayıt döndüren alt sorgular: 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. Yazının başında verdiğim örnek tek kayıt dönen alt sorgudur.

Çok kayıt döndüren alt sorgular: 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.

IN: Kelime anlamı içinde olan in operatörü ile birden fazla değer aramak için kullanılır.

SELECT * FROM employees
WHERE department_id IN
(SELECT department_id FROM employees WHERE first_name='Alexander');

Yukarıda ki örnekte alt sorgu 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 alt sorguda ile dönen kayıtlardan listede olanlar dönerler.

oracle-sql-8-2

ANY: İngilizce’de de herhangi biri anlamına gelen any komutu sql komutumuzda da herhangi biri anlamını taşır.

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

Bu sorguda IT bölümündeki çalışanların maaşlarından küçük olması ve IT bölümünde çalışmayanların bilgisini verir.

ALL: İngilizce’de de hepsi anlamına gelen ALL komutu sql komutumuzda da hepsi anlamını taşır.

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

Burada ALL dediğimiz için IT bölümündeki en küçük maaşıda içereceğinden hepsi için sorgulama yapıp sonuçu verir.

SUBQUERY ile HAVING Kullanımı

Having: Gruplanmış verileri filtremek için kullanırız.

SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 70);

Sırasıyla resimleri inceleyin ve mantığını anlayın ;)

oracle-sql-8-3
oracle-sql-8-4
oracle-sql-8-5

Alt sorgular konumuzunda sonuna geldik. Bir sonraki derste görüşmek üzere :)