Home / MAKALELER / Veri Tabanı / Group By ve Having By

Group By ve Having By

Pusula Akademi Oracle Grubundan Anıl Erdoğan’ın sql group by ve having by işlemleri konusunda yazdığı makalesi. Kendisini Tebrik ediyoruz ve devamını bekliyoruz.

SELECT cümlesi bize geriye bir liste halinde veri(ler) döndürür ve çalışma prensibini üç ana bölümde inceleyebileceğimiz bir komuttur. Bunlar;
–    Süzme işlemi (WHERE; şart komutumuz)
–    Sıralama işlemi (ORDER BY; sıralama komutu {asc ve desc gibi kriterleri mevcut})
–    Geri dönen liste üzerin de yapılan işlemler (GROUP BY, HAVING, GROUP BY fonksiyonları)

GROUP BY Fonksiyonları
–    AVG: Veri tabanımızda sayısal değeri olan veriler için ortalama almamıza yarayan bir fonksiyondur.
–    COUNT: Bir sorgu tarafından döndürülen verilerin sayısını almamıza yarayan bir fonksiyondur.
–    FİRST: Bir sorgu tarafından döndürülen verilerin ilk değerini almamıza yarayan bir fonksiyondur.
–    LAST: Bir sorgu tarafından döndürülen verilerin son değerini almamıza yarayan bir fonksiyondur.
–    MAX: Bir sorgu tarafından döndürülen verilerin en büyük değerini almamıza yarayan bir fonksiyondur.
–    MIN: Bir sorgu tarafından döndürülen verilerin en küçük değerini almamıza yarayan bir fonksiyondur.
–    STDDEV: Standart sapmayı veren bir fonksiyondur.
–    SUM: Bir sorgu tarafından döndürülen verilerin toplamını almamıza yarayan bir fonksiyondur.
–    VARIANCE: Verinin varyansını hesaplayan bir fonksiyondur.

Fonksiyonları daha iyi anlamak için örneklerle pekiştirelim, bunun için de iki tane tablo oluşturup veri ekleyeceğiz;

create table sanatcilar
(
sanatci_id number constraint snt_const primary key,
sanatci_adi varchar2(20),
sanatci_soyadi varchar2(20),
maas number,
dal_id number
);

insert into sanatcilar(sanatci_id,sanatci_adi,sanatci_soyadi,maas,dal_id) values(1,’Tarkan’,’Tevetoğlu’,90000,10);
insert into sanatcilar(sanatci_id,sanatci_adi,sanatci_soyadi,maas,dal_id) values(2,’Sertab’,’Erener’,70000,10);
insert into sanatcilar(sanatci_id,sanatci_adi,sanatci_soyadi,maas,dal_id) values(3,’Emre’,’Aydın’,80000,10);
insert into sanatcilar(sanatci_id,sanatci_adi,sanatci_soyadi,maas,dal_id) values(4,’Kenan’,’İmirzalıoğlu’,50000,20);
insert into sanatcilar(sanatci_id,sanatci_adi,sanatci_soyadi,maas,dal_id) values(5,’Şener’,’Şen’,100000,20);

select * from sanatcilar

groupHavingresim1

 

Sanatcilar adında bir tablo oluşturuldu ve beş adet veri eklendi sonrasında da bir üstteki resimde gözüktüğü gibi ekran çıktısı alındı. Yalnız tablo oluşturulurken sanatci_id kolonuna constraint özellik atandı yani tablo için unique yani tek haline geldi, peki unique yapmakta ki amacımız neydi? Bir kolonu unique özellik yapıyorsak o tablo için unique yapılan kolon veri için ayırt edici bir özelliktir mesela kişinin TC Kimlik numarası gibi düşünebiliriz velhasıl sanatci_id kolonu unique yapıldığına göre aynı değer girilemez şimdi de bunu test edelim;

insert into sanatcilar(sanatci_id,sanatci_adi,sanatci_soyadi,maas,dal_id) values(5,’Kemal’,’Sunal’,100000,20);

groupHavingresim2

 

create table dal
(
dal_id number constraint dl_const primary key,
dal_adi varchar2(20)
);

insert into dal(dal_id,dal_adi) values(10,’Şarkıcı’);
insert into dal(dal_id,dal_adi) values(20,’Oyuncu’);

select * from dal

groupHavingresim3

 

İkinci tablo oluşturuldu, veri eklendi ve üstteki resimde olduğu gibi ekran çıktısı alındı, bu gerekli temel tablo oluşturma işlemlerinden sonra group by fonksiyonlarını daha detaylı inceleyelim;
–    AVG Örnek:

select dal_id,avg(maas) ortalama
from sanatcilar
group by dal_id
order by 1;

groupHavingresim3

 

AVG fonksiyonu, dal_id‘ si 10 olan verilerin maaşlarının ortalamasını 80000 ve 20 olan verilerin maaşlarının ortalamasını 75000 olarak görmemizi sağladı.

–    COUNT Örnek:
select sanatci_adi,sanatci_soyadi, count(1) sayısı from sanatcilar
group by sanatci_adi,sanatci_soyadi

groupHavingresim4

 

select dal_id,count(1) sayısı from sanatcilar
group by dal_id
order by 1

groupHavingresim5

 

COUNT fonksiyonu, verinin veya verilerin sayısını verdiğini yukarıdaki iki örnek ile gözlemledik.

–    MAX Örnek:

select dal_id, max(maas) en_büyük_maaş from sanatcilar
group by dal_id

groupHavingResim7

 

MAX fonksiyonu, dal_id ye göre maaşlar arasından en büyüğünü verir.

–    MIN Örnek:
select dal_id, min(maas) en_küçük_maaş from sanatcilar
group by dal_id

groupHavingresim8

 

MIN fonksiyonu, dal_id ye göre maaşlar arasından en küçüğünü verir.

–    SUM Örnek:
select dal_id, sum(maas) toplam_maaş from sanatcilar
group by dal_id

groupHavingresim9

 

SUM fonksiyonu, dal_id ye göre maaşların toplamını alır.

GROUP BY

‘ Group by nerelerde kullanılır ’ sorusuna cevap arayalım; group by, group fonksiyonlarının (AVG, SUM, COUNT vs.) uygulandığı kolonların dışarısında kalan kolonları alır ve gruplama yapar. Peki  buna neden gereksinim duyarız; Bazı durumlarda veriler için unique özellik aranır, (primary key olmayan kolonlar için) mesela bir satırda ad, soyad ve email gruplanırsa o sorgu için unique bir şart sağlanmış olur:

select count(1) sayısı,ad,soyad,mail from personel2
group by ad,soyad,mail
having count(1) >= 1
order by 1;

groupHavingresim10

 

Sayısı kolonunda da gözüktüğü gibi 3 kolon gruplanırsa unique özellik olmuş olur ve tektir.

HAVING
Grup fonksiyonu kullanılan kolonlar üzerinden şart oluşturmak istenirse bunu where ile yapamayız fakat where görevinde, grup fonksiyonları için özel şart komutu having kullanılır:

select dal_id,max(maas) max_maaş
from sanatcilar
group by dal_id
having max(maas) > 50000
order by 1;

groupHavingresim11

 

Son olarak gördüğümüz tüm işlemlerin genel yapısını görelim:
SELECT [ DISTINCT | ALL ] <sütun(lar)> FROM <tablo adı (lar)>
[ WHERE <şart (lar)> ] [ GROUP BY <sütunlar>] [ HAVING < grup kısıtlaması>]

Group by & Having işlemini size basit örneklerle anlatmaya çalıştım umarım faydalı olmuştur, bir sonraki  Transaction konulu makalem  de görüşmek dileği ile… Anıl ERDOĞAN

 

About Yusuf Arslan

Sakarya Üniversitesi Bilgisayar Mühendisliği bölümünü bitirdikten sonra kariyerine Datawarehouse-Database Uzmanı olarak devam etmektedir Sitenin kurucusu ve yazarıdır. yusufarslanbm@gmail.com adresinden bana ulaşabilirsiniz.

İlginizi Çekebilir

SQL Server ile Veri Şifreleme

Bilgi teknolojilerinde verinin güvenliği çok kritik bir öneme sahiptir. Önemli verileri korumak için ekstra bir …

Bir Cevap Yazın