SQL OPERATÖRLERİ

SET OPERATÖRLERİ

SET operatörleri birden fazla tabloları ve sorguları birleştirmek için kullanılır.

4 adet SET operatörü vardır :

  • UNION
  • UNION ALL
  • INTERSECT
  • MINUS

UNION OPERATÖRÜ

İki veri kümesindeki verileri birleştirir fakat kesişim kümesi olan aynı değere sahip kayıtları almaz.

union

sql-union-query

ÖRNEK : Personeller ve pozisyon geçmişindeki aynı olmayan kayıtları listeleyelim

SELECT employee_id, job_id FROM hr.employees
UNION
SELECT employee_id, job_id FROM hr.job_history;

UNION ALL OPERATÖRÜ

  •  İki veri kümesindeki verileri birleştirir.
  • Aynı değere sahip kayıtları da getirir

sql-union-all-query

ÖRNEK : Personeller ve pozisyon geçmişindeki aynı olan tüm kayıtları listeleyelim

SELECT employee_id, job_id, department_id FROM hr.employees
UNION ALL
SELECT employee_id, job_id, department_id FROM hr.job_history

INTERSECT OPERATÖRÜ

İki veri kümesindeki verilerin kesişim kümesini bulur.

1245-img3A

ÖRNEK: Maaşı 1000 ve 5000 arasındaki personeller ile maaşı 3000 ve 7500 arasındaki kesişen personelleri bulalım

Select first_name,last_name,salary from hr.employees where salary between 1000 and 5000
intersect
select first_name,last_name,salary from hr.employees where salary between 3000 and 7500;

MINUS OPERATÖRÜ

İki veri kümesindeki verilerin birbirinden farkını gösterir.

A’ da olup B’de olmayanlar yada B’de olup A’da olmayanlar.sql minus

ÖRNEK : Employees tablosundaki kayıtların job_history tablosundaki kayıtlardan farkını listeleyelim

SELECT employee_id, job_id FROM hr.employees
minus
SELECT employee_id, job_id FROM hr.job_history;

ALT SORGULAR

  • Uygulamada, bir sorgudan elde edilen sonuç, bir diğer sorguyu ilgilendirebilir. Bu gibi durumlarda alt sorgular ya da bir başka deyişle iç sorgular kullanılır.
  • Alt (iç) sorgu, ana (dış) sorgudan önce çalıştırılır.
  • Alt sorgunun sonucu ana sorgu tarafından kullanılır.
  • Alt sorgular istenilen sonuçların kolay ve anlaşılır bir şekilde bulunmasını sağlar.

ÖRNEK : Soyismi Abel olan personelin maaşına eşit veya ondan yüksek maaş alan personelleri listeleyelim

select first_name , last_name, salary
from HR.EMPLOYEES
where salary>=(
select salary
from hr.employees
where lower(last_name)=’abel’)
order by 3

altsorgu1

ALT SORGU ÇEŞİTLERİ

Tek Satır Döndüren Alt Sorgular

altsorgu2

Birden Fazla Satır Döndüren Alt Sorgular

altsorgu3

ÖRNEK : Soyadı Austin olan Personelle aynı pozisyonda olup Soyadı Ernst olan personelden yüksek maaş alan personelleri listeleyelim

select first_name, last_name, job_id, salary
from HR.EMPLOYEES
where job_id=(select job_id from HR.EMPLOYEES
where lower(last_name)=’austin’)
and salary>(select salary from hr.employees
where upper(last_name)=’ERNST’)

altsorgu4

ÖRNEK : Personeller içerisinde minimum maaşı alan kişiyi listeleyelim

SELECT first_name,last_name, job_id, salary
FROM hr.employees
WHERE salary = (SELECT MIN(salary)
                               FROM hr.employees)

altsorgu5

ÖRNEK : 50 numaralı departmandaki minimum maaşlı personelden daha yüksek maaş alan personelleri listeleyelim

select first_name,last_name,department_id,salary from HR.EMPLOYEES
where salary>(select min(salary) from HR.EMPLOYEES
where department_id=50)

altsorgu6

ÖRNEK : Departmenlardaki minimum maaş alan personelleri listeleyelim.

SELECT employee_id, last_name,department_id,salary
FROM hr.employees t
WHERE salary =(SELECT
MIN(salary)
FROM hr.employees
GROUP BY department_id);

altsorgu7

sql i bu şekilde yazdığımızda yukarıdaki hatayı alıyoruz bu hatanın sebebi sql de ilk çalışan kısım alt sorgudur ve alt sorguda birden fazla satır döndürülürse bu hata oluşur buınun önüne geçmek için aşağıdaki gibi bir kısıtlama getirilmelidir.

SELECT employee_id, last_name,department_id,salary
FROM hr.employees t
WHERE salary =(SELECT
MIN(salary)
FROM hr.employees
GROUP BY department_id
having department_id=t.DEPARTMENT_ID);

alt sorgu 8

ÇOK SATIRLI ALT SORGULAR

altsorgu3

Çok satır karşılaştırma operatörleri ile birlikte kullanılırlar

  •  IN 
  • ANY
  • ALL

NOT :

altsorgu7

Alt sorguda birden fazla satır döndüğünde yandaki hatayı alırız bu hatayı almamak için yukarıdaki operatörler kullanılır veya alt sorgudan tek satır dönmesi sağlanır.

IN OPERATÖRÜ

Bir liste içindeki değerlerden herhangi birine eşit olup olmadığını bulmak için kullanılır.

ÖRNEK : Departmanların minumum maaşlarına eşit maas alan personelleri listeleyelim

SELECT employee_id, first_name,last_name,salary
FROM hr.employees
       WHERE salary in
             (SELECT MIN(salary)
             FROM hr.employees
             GROUP BY department_id);

in

ANY OPERATÖRÜ

  • Alt sorgu tarafından üretilen herbir değeri ana sorgu içinde belirlenen bir değerle karşılaştırmak söz konusu ise ANY operatörü kullanılır.
  • Bu işleç “=,<,>” işleçlerinden biri ile birlikte kullanılır. =ANY” biçimindeki bir tanım IN tanımı ile eşdeğerdir.
  • <ANY ifadesi “en büyükten daha küçük”,
  • >ANY ise “en küçükten daha büyük” anlamında değerlendirilir.

ÖRNEK : Personeller içerisinde IT_PROG pozisyonuna sahip personellerin içerisindeki en yüksek maaş alan personelden daha düşük maaş alan personelleri listeleyelim

(IT_PROG pozisyonunda çalışanlardan max maaş alan 9000 dir aşağıdaki sql de 9000 den küçük maaş alan tüm personeller getirilmiştir. )

SELECT employee_id, last_name, job_id, salary
FROM hr.employees
WHERE salary <ANY
                      (select salary
                    from HR.EMPLOYEES
                      where job_id=’IT_PROG’)

any1

ALL OPERATÖRÜ

  • Alt sorgu tarafından üretilen tüm değerlerin, ana sorgu için bir girdi olarak kullanılması söz konusu ise ALL işleci kullanılabilir.
  • >ALL ifadesi “en büyükten daha büyük”;
  • <ALL ise “en küçükten daha küçük” olanları ifade eder.

ÖRNEK : Personel tablosunda IT_PROG pozisyonundaki en yüksek maaştan daha yüksek maaş alan personelleri listeleyelim

(IT_PROG pozisyonundaki max maaş 9000 idi o halde 9000 den daha fazla maaş alanları all operatörü ile listelemeliz en büyükten daha büyük ifadesi >ALL )

select first_name, last_name, job_id, salary
from HR.EMPLOYEES
WHERE salary >ALL
                         (Select salary
                          from HR.EMPLOYEES
                          where job_id=’IT_PROG’)

all