Oracle Database — SQL Temelleri 6 — Grup Fonksiyonları

Merhabalar,

Bu yazımda Oracle SQL’de grup fonksiyonlarını anlatacağım. Bu fonksiyonlar Avg(ortalama), Count(sayma), Max(maximum), Min(minimum), Sum(toplam)’dır.

Grup Fonksiyonları

Grup fonksiyonları Syntax:

SELECT group_function(column), ...
FROM table
[WHERE condition]
[ORDER BY column];

Örnek:

SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%PROG%';
oracle-sql-6-1

Gördüğünüz gibi job_id’si içinde PROG geçenlerin ortalama,maksimum,minimum, ve toplam maaşlarını sorgulamış olduk.

Count Fonksiyonu: Tablodaki satır sayısını verir.

SELECT COUNT(*)
FROM employees
WHERE department_id = 50;

departman id’si 50 olan kayıtların toplam sayısını sorguladık.

Grup Fonksiyonları ve Boş Değerler:

SELECT AVG(commission_pct)
FROM employees;
--SONUC: 0.2228571428571428571428571428571428571429
--HATALIDIR ÇÜNKÜ ARADA NULL DEĞERLER VARDIR.
SELECT AVG(NVL(commission_pct, 0))
FROM employees;

bu sorguda null değerleri çıkarttık ve sonuç:

oracle-sql-6-2

Satırları Gruplanması

GROUP BY: SQL cümlelerinde veriler gruplanmasını istediğimiz group by ifadesi ile belirtiriz.

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;

bu sorguda departman id ile maaş ortalaması aldık.

oracle-sql-6-3

Çoklu Sütunlar için Gruplandırma:

SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id
ORDER BY SUM(salary);
oracle-sql-6-4

HAVING ile Grup Sonuçlarını Koşullara göre Kısıtlama:

Gruplamada where kullanılmaz onun yerine having kelimesinden yaralanılır ve şartlar having’den sonra yazılır.

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;

bu sorgu where gibi çalışır fakat şarta göre gruplama yapar.

oracle-sql-6-5

Diğer örneğimiz:

SELECT job_id, SUM(salary) "Toplam Maaş"
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 12000
ORDER BY SUM(salary);

job id içinde rep olmayan, job id ile grupla, maası 12000'den büyük olanları maasa göre sıralanmasını belirtik.

oracle-sql-6-6

Grup Fonksiyonlarını İç İçe Kullanma:

Grup fonksiyonları kullanırken dikkatli olmak gerekir, yeri önem taşır. Örneğimizi inceleyelim.

SELECT MAX(AVG(salary))
FROM employees
GROUP BY department_id;
oracle-sql-6-7

grup fonksiyonlarında ilk önce iç kısımda yer alan hesaplanır sonra dıştakiler hesaplanır. Bu sorguda önce maaşların ortalamasını aldık sonra en büyüğünü yazdırdık.

SELECT AVG(MAX(salary))
FROM employees
GROUP BY department_id;
oracle-sql-6-8

önce max maaşlar bulundu sonra gruplandı.

Bir konunun daha sonuna geldik. Kafanıza takılan merak ettiğiniz şeyler olursa sormaktan çekinmeyin. Görüşmek üzere :)