Adem KALIN – Yazılım Mühendisi

Aggregate Fonksiyonlar ve NULL

Aggregate fonksiyonlar, SUM, MAX, MIN, AVG, COUNT gibi, belirli bir veri setinden özet sonuçlar getiren built-in (yani dil ile gelen) fonksiyonlardır. Yani kısaca özet fonksiyonları olarak ifade edilebilirler. Bu yazıda konu olarak aggregate fonksiyonlarının ayrıntılı özelliklerini ele almak istemiyorum, ihtiyaç duyanlar DBMS (Database Management System – Veritabanı Yönetim Sistemi) lerin online dokümanlarından kolaylıkla faydalanabilirler. Ben daha çok NULL değerlerin aggregate fonksiyonları uzerindeki etkilerinden bahsetmek istiyorum. Aşağıdaki okuyacağınız bilgileri bütün SQL dillerinde ortak bir yaklaşım tarzı olarak düşünebiliriz.

NULL değerler, kullanılan ortam, dil yada DBMS ‘den bağımsız olarak, aggregate fonksiyonları tarafından dikkate alınmazlar. Bir örnek ile açıklamak gerekirse, SUM fonksiyonu ile toplanmak istenen bir kolona ait değerlerin içerisinde NULL değerler de varsa, onlar dikkate alınmaz ve geri kalan nümerik değerler toplanır. Aynı şekilde AVG fonksiyonu ile ortalama bir değer hesaplanacağı zaman, NULL değer dışındaki değerlerin ortalaması alınır. Yani aslında özet olarak, NULL degerler içeren bir kolon için hesaplama yaparken, fonksiyon, o NULL değer içeren satırlar select sonucuna hiç gelmemiş gibi davranır diyebiliriz.

Fakat bu noktada COUNT fonksiyonu biraz farklılık gostermekterir. Fonksiyon bilindiği üzere iki şekilde kullanılabilmektedir:

– * operatörü ile birlikte [ COUNT(*) olarak]
– Herhangi bir kolon yada koşula bağlı şekilde [COUNT(column_name) yada COUNT(DISTINCT column_name) vs gibi]

İlk kullanım şeklini kullandığımızda yani bütün kolonlar için satır sayısı beklendiği durumda, kolonlardan biri yada birkaçı NULL değerler içerse dahi select sonucunda gelen sonucun satır sayısını dönmektedir. İkinci seçenekteki gibi koşullu kullanımlarda ise, aynen diğer aggregate fonksiyonları gibi davranarak NULL değerleri gözardı etmektedir.

Şimdi bu yazdıklarımızı örnekler ile daha anlaşılır kılmaya çalışalım.

Öncelikle, aşağıdaki gibi bir veri setimizin olduğunu varsayalım :

Name    VALUE
------- ---------
A       1
A       1
A       4
B       3
B       3
B       4
B       6
B       (NULL)
C       (NULL)
C       (NULL)

Şimdi aşağıdaki sorguları ve bu sorgular sonucunda oluşacak çıktıları inceleyelim.

1
2
3
4
5
6
7
8
9
10
SELECT Name, 
       MAX(VALUE)		MaxValue,
       MIN(VALUE)		MinValue, 
       AVG(VALUE)		AVGValue,
       COUNT(*)			RowCount,
       COUNT(VALUE)		ValueCount,
       COUNT(DISTINCT VALUE)	DistinctCount
  FROM Table_Name
 GROUP BY Name
 ORDER BY Name;
Name	MaxValue	MinValue	AVGValue	RowCount	ValueCount	DistinctCount
-------	-----------	-----------	-----------	-----------	-----------	--------------
A	4		1		2		3		3		2
B	6		3		4		5		4		3
C	(NULL)		(NULL)		(NULL)		2		0		0

Yukarıdaki sonuçlardan da göreceğiniz üzere, NULL değerler dikkate alınmamaktadırlar. Bundan dolayı, Name = C olan satır için COUNT fonksiyonu dışındaki değerler NULL gelmekte.

Fakat aynı durumu COUNT ile hesaplanan kolonlar için incelediğimizde farklılık görüyoruz, değerler 0 olarak hesaplanmış durumda. Bunun sebebi de, COUNT fonksiyonunun her zaman bir değer dönüyor olmasıdır. Eğer sayması gereken değerlerin tamamı NULL yada hiç değer yok ise 0, bunun dışındaki durumlarda ise NULL ‘dan farklı satırs sayısını dönmektedir.

Yukarıdakine benzer küçük örnekleri siz de deneyerek mantığınıza daha iyi oturtabilirsiniz.

İyi denemeler 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir