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.
Ö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
Ö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.
Ö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.
Ö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
ALT SORGU ÇEŞİTLERİ
Tek Satır Döndüren Alt Sorgular
Birden Fazla Satır Döndüren Alt Sorgular
Ö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’)
Ö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)
Ö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)
Ö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);
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);
ÇOK SATIRLI ALT SORGULAR
Çok satır karşılaştırma operatörleri ile birlikte kullanılırlar
- IN
- ANY
- ALL
NOT :
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);
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’)
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’)
Bir yanıt yazın