Diğer dersleri http://selimkaratas.com.tr/oracle-11g-r2-egitimi-ders-notlari adresinden bulabilirsiniz.
7. Using Subqueries to Solve Queries
Subquery Syntax
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
Birden fazla select çekmeden subquery ile direkt bilgiye ulaşmak amacıyla kullanıyoruz:
SELECT last_name, salary FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Fox') -- Adı Fox olan kişinin maaşından daha fazla maaş alanları bilgisi
Subquerie’lerin Çeşitleri
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 117);
-- 117 id'li çalışan ile aynı departmanda çalışanların bilgisi
SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE last_name = 'Baida') AND salary > (SELECT salary FROM employees WHERE last_name = 'Baida'); -- Baida ile aynı departmanda çalışıp ondan daha fazla maaş alanların bilgisi
SUBQUERY ile HAVING CLAUSE Kullanımı
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 70);
-- 70 numaralı departmanın en düşük maaşından daha fazla maaş alan departman bilgisini alırız.
-- select sorgularını ayrı ayrı çalıştırarak yapmak istediğimiz işlemi görebiliriz.
Hatalı İstek
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
--Çok satırlı sroguyu ile tek satırlı sorguyu subquery yapamayız.
ALL / ANY Operatorleri Kullanımı
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';
/* IT departmanında çalışanların maaşlarından küçük olması şartları sağlayan ve IT departmanında çalışmayanların bilgisini verir. */
Sırası ile gidelim ve önceki içteki sorguyu çalıştırıp IT departmanındaki maaşlara bakalım.
ANY yazdığımız için burada geçerli şart için 9000’den küçük olanlara bakıyoruz. Çünkü 4200’den küçükleri, 4800’den küçükleri …. 9000’den küçükleri yazdıracaktır. Her şartı tek tek kontrol edip sağladığını gösterir.
Subquery’li sorgumuzu çalıştırdığımızda aşağıdaki çıktıyı alırız.
Görüldüğü gibi sadece en düşük maaş olan 4200’den küçükleri değil 9000’den küçük olanları da getirdi.
Aynı sorguyu ALL diyerek yaptığımızda ise aşağıdaki çıktıyı alırız.
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';
Buradaki sorguda ALL dediğimiz için 4200’den küçük olma şartı bütün maaş bilgilerinden küçük olma şartını sağladığı için onu kontrol edip çıktı verir.
Görüldüğü gibi maaş aralıkları 4200’den küçük olarak yer almaktadır.
Null values in a subquery
WHERE manager_id IS NOT NULL şartı ile sorgulama yaptığımızda manager_id kısmı boş olmayanları getirecektir. Null değerlerin olduğu tablolarda bu çözüme gidebiliriz.
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id IN
(SELECT mgr.manager_id
FROM employees mgr);
-- müdür olanların bilgisi
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM employees mgr);
-- müdür olmayanların bilgisi









