Tags
iki tabloyu raporlama, Minus, Multiple Query, Oracle SQL intersect, Oracle SQL Minus, Oracle SQL union all, SQL Union, İntersect
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 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 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;
select * from 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;
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;
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;
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;
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.
Pingback: SQL- JOIN | Site başlığı