Tags

, , , , , , ,

Merhaba Arkadaşlar,2013 bitmeden  bu konuyu yazmak istedim. Bu yazımızda set operatörlerinden bahsedeceğiz. Set operatörleri 4 tanedir. Bunlar: Union, Union All, Intersect ve Minus operatörleridir. Bu operatörleri neden kullanmak istiyebiliriz ?sorusunun bir çok cevabı var. Bir kaç örnek vereyim. Mesela bir operasyon yaptınız ve bir tablonun aynısından bir tane daha oluşturduğunuzu düşünüyorsunuz. Böyle bir durumda bunu kontrol etmek için Minus operatörünü kullanabiliriz veya iki tablo arasındaki ortak alanları(aynı veri) merak ediyorsak(Buna kesişimleri diyebiliriz) Intersect operatörünü kullanırız veya iki tabloyu bir arada rapor etmek istiyorsak Union operatörünü kullanabiliriz. Aşağıda A ve B tablosu düşünülerek hazırlanmış bir görüntü paylaşıyorum. Bu arada sağ üstteki Union All operatörünü gösteren şekildeki orta alan raporlarken 2 kez tekrar ediyor diye biraz daha beyazlaşmış, şekillerde gri alanlar sorgudan dönecek kısmı temsil ediyor.

set operators

set operators

Set operatörleri iki ayrı sorgu arasına yazılacak şekilde kullanılır. Sorgularımızda kolon sayısı ve kolonların tipleri aynı olmalıdır.Eğer A tablosundaki kolona karşılık gelen bir kolon B tablosunda yoksa B tablosunu raporladığımız sorguda A tablosuna karşılık gelen kolonun yerine null yazabiliriz yada number tipinde bir değer ise herhangi bir sayı yazabiliriz.Bu arada kolonlara bir alias vermek istersek üst taraftaki sorgudaki kolonlara vermeliyiz çünkü onlara göre sıralama yapacak operatörlerimiz. Şimdi üstünde çalışacağımız tablolardan bahsedelim. Bu tablolardan employees tablosu çalışanlarımızın bilgisini tutar. Job_history tablosu ise eski çalışanların işe giriş,işten çıkış gibi bilgileri tutar.Mesela burada employees tablosunda işten çıkış bilgisi bulunmayacağı için o alana null yazabiliriz. Şimdi birazdan üstünde çalışacağımız tabloları daha iyi anlamanız için tabloların kolonlarını ve içindeki verileri görüntüleyelim.

desc employees;

 

desc employees

desc employees

 

desc job_history;

 

desc job_history

desc job_history

Tablolarımızla alakalı kolon isimlerini ve tiplerini görüntüledik. Şimdi tablolarımızdaki verilere bakalım kaç satır kayıt var.Bu kısım önemli konuyu anlamak için bize çok yardımcı olacak.

select *  from employees;
employees

employees

select * from job_history;
job_history

job_history

UNION

Arkadaşlar employees tablomuzda 107 kayıt var,Job_history tablomuzda ise 10 kayıt var bu 10 kayıt işten çıkmış veya job_id si değişmiş veya departmanı değişmiş kişiler. Yani hala bu tabloda olup ta çalışanlar olabilir. Yani hem bu tabloda hem de employees tablosunda aynı kayıt olabilir. Biz bu noktada şirketimizde şu ana kadar kaç farklı kişi çalışmış bunu öğrenmek istersek: İki tabloyu UNION operatörü ile birleştiririz ve 2 tablodada olanları sadece 1 kez saymış oluruz.Yani matematikte birleşim kümesi dediğimiz olay budur.

select employee_id, job_id from employees 
UNION
select employee_id, job_id from job_history;
union

union

115 satır döndü bu sorgumuzdan eğer hiç ortak kayıt olmasaydı 117 satır dönerdi. Demek ki 2 kayıt aynı ve o iki kayıt o yüzden dönmedi.Bu iki kayıdı görmek için INTERSECT operatörünü kullanalım.

select employee_id, job_id from employees
INTERSECT
select employee_id, job_id from job_history;

 

intersect

intersect

 

 

Arkadaşlar yukarıda iki tablonun ortak kayıtlarını görüntülemiş olduk. Union All, Union operatöründen farklı olarak iki tabloyu direk birleştirir yani kayıtların tekrar edip etmemesini önemsemez ve sıralama yapmaz.Bu yüzden daha hızlıdır.Employees tablomuzda toplamda 107 kayıt vardı. Job_History tablomuzda ise 10. Union All direk ikisini alıp bize alt alta rapor eder. Dönen row sayısı 107+10=117 olacaktır.

select employee_id, job_id from employees
UNION ALL
select employee_id, job_id from job_history;
union all

union all

MINUS

Arkadaşlar en yukarıda demiştikki bir tablonun aynısından bir tane daha oluşturduğumuzda içindeki kayıtların birebir aynımı olup olmadığını anlamak için Minus kullanırız çünkü Minus operatörü üstte yazılan tablodaki kayıtlardan altta yazılan tablodaki aynı kolonları çıkartır. Yani bizim Employees ve Job_History Tablomuza göre konuşursak; Employees tablosunda employee_id ve job_id kolonlarının içindeki kayıtlardan Job_history tablosundaki employee_id ve job_id kolonlarındaki kayıtlar aynıysa o satırları çıkartacaktır. Aynı olanları yukarıda INTERSECT ile ölçmüştük 2 tane vardı. Ozaman 107 kayıtlı olan employees tablosundan 105 satır dönüş olacaktır.

select employee_id, job_id from employees 
MINUS
select employee_id, job_id from job_history;

 

minus

minus

 

Arkadaşlar Yukarıdaki örnekleri belirli bir standart uygulayarak yaptım. Kolonların sayısını arttırırsanız veya azaltırsanız dönen sonuçlar değişecektir. Umarım yararlı olmuştur. Bir sonraki yazımızda görüşmek üzere.

 

 

 

Advertisements