Kategoriler
ORACLE

Oracle Database 11g – SQL Temelleri I || Subqueries

Diğer dersleri https://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

subquery

 Subquerie’lerin Çeşitleri

Types of Subqueries

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

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.

having clause

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.

hatalı istek

 

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.

it maaşlar

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.

subquery çıktı

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.

ALL

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

-- 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

-- müdür olmayanların bilgisi

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir