Yadımıza salaq ki, aqreqat funksiyalar — birdən çox sətrə eyni anda baxıb bir nəticə qaytaran funksiyalardır. PostgreSQL-də tez-tez aşağıdakı aqreqat funksiyalardan istifadə edəcəksən:
SUM()— məlumatların cəmlənməsi.AVG()— orta dəyərin tapılması.MIN()— minimum dəyərin tapılması.MAX()— maksimum dəyərin tapılması.COUNT()— sətrlərin sayılması.
İlk baxışdan hər şey asandır: funksiyaya sütun və ya ifadə verirsən, nəticəni alırsan. Amma bəs sütunda NULL varsa nə baş verir?
Aqreqatlarda NULL-un davranışı: qısa icmal
Ən maraqlı yer burdan başlayır:
SUM()vəAVG()NULL-u saymır. Əgər heç olmasa bir sətrdəNULLvarsa, o sadəcə hesablamalara qatılmır. Ədalətli yanaşmadır, axı "kim partiyaya gəlməyibsə", cəmi necə artırsın? Və ya bir dəyər çatışmırsa, orta necə hesablansın?MIN()vəMAX()daNULL-u ötürür. Onlar yalnızNULLolmayan dəyərlər arasında minimum və ya maksimum tapır. Yəni, ən gənc işçini axtaranda, doğum tarixini doldurmayanNULL"qalib" olmayacaq.COUNT(*)bütün sətrləri sayır, həttaNULLolanları da. AmmaCOUNT(column)yalnız həmin sütunda dəyəri olan sətrləri sayır, yəniNULLnəzərə alınmır.
Gəlin bunu nümunələrlə aydınlaşdıraq.
NULL ilə aqreqat funksiyaların istifadəsi nümunələri
Burada students_scores adlı cədvəl var, tələbələrin test ballarını saxlayır:
| student_id | name | score |
|---|---|---|
| 1 | Alisa | 85 |
| 2 | Bob | NULL |
| 3 | Çarli | 92 |
| 4 | Dana | NULL |
| 5 | Elena | 74 |
İndi bir neçə sorğu yazıb nəticələrinə baxaq:
- Bütün balların cəmi:
SUM()
SELECT SUM(score) AS total_score
FROM students_scores;
Nəticə:
| total_score |
|---|
| 251 |
Gördüyün kimi, NULL olan sətrlər cəmləmədə iştirak etmədi. Alisa (85), Çarli (92) və Elena (74) üçün cəm 251 oldu. Bob və Dana kənarda qaldı.
- Orta bal:
AVG()
SELECT AVG(score) AS average_score
FROM students_scores;
Nəticə:
| average_score |
|---|
| 83.67 |
Yenə də NULL nəzərə alınmadı və orta yalnız balı olanlar üçün hesablandı: (85 + 92 + 74) / 3 = 83.67.
- Minimum və maksimum bal:
MIN()vəMAX()
SELECT
MIN(score) AS min_score,
MAX(score) AS max_score
FROM students_scores;
Nəticə:
| min_score | max_score |
|---|---|
| 74 | 92 |
Burada da hər şey sadədir: NULL yenə də sayılmadı, minimum 74, maksimum isə 92 oldu.
- Sətrlərin sayı:
COUNT(*)vəCOUNT(column)
SELECT
COUNT(*) AS total_rows,
COUNT(score) AS non_null_scores
FROM students_scores;
Nəticə:
| total_rows | non_null_scores |
|---|---|
| 5 | 3 |
COUNT(*)bütün sətrləri saydı, həttascoreNULLolanda da.COUNT(score)isə yalnızscoresütununda dəyəri olan sətrləri saydı.
Praktik hallar
Gəlin bir neçə praktik nümunəyə baxaq.
Nümunə 1: Maaşı göstərilən və göstərilməyən işçilərin sayı
Tutaq ki, employees adlı cədvəldə maaşlar var.
| id | name | salary |
|---|---|---|
| 1 | Alex Lin | 50000 |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 60000 |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 55000 |
Bilmək istəyirik ki, neçə işçi maaşını göstərib, neçə nəfər göstərməyib.
SELECT
COUNT(*) AS total_employees,
COUNT(salary) AS employees_with_salary,
COUNT(*) - COUNT(salary) AS employees_without_salary
FROM employees;
Burada:
COUNT(*)ümumi işçi sayını qaytarır.COUNT(salary)maaşı göstərən işçilərin sayını verir.- Maaşı olmayanların sayını hesablamaq üçün birini digərindən çıxırıq.
Nəticə
| total_employees | employees_with_salary | employees_without_salary |
|---|---|---|
| 5 | 3 | 2 |
Nümunə 2: Qiyməti olmayan məhsulları nəzərə alaraq orta qiymətin hesablanması
Sən sehrli mağaza sahibisən və products cədvəlində price sütunu var, amma bəzi məhsulların qiyməti hələ yazılmayıb.
| id | name | price |
|---|---|---|
| 1 | Magic Wand | 150 |
| 2 | Enchanted Cloak | NULL |
| 3 | Potion Bottle | 75 |
| 4 | Spell Book | 200 |
| 5 | Crystal Ball | NULL |
Sənə yalnız qiyməti olan məhsullar üçün orta qiymət lazımdır.
SELECT AVG(price) AS average_price
FROM products;
Nəticə:
| average_price |
|---|
| 141.6667 |
Əgər qiyməti olmayan məhsullar üçün default qiymət vermək istəsən (məsələn, 0), onda COALESCE() funksiyasından istifadə edə bilərsən — bu, növbəti leksiyanın mövzusudur.
Nümunə 3: Tələbələrin minimum və maksimum yaşının tapılması
students cədvəlində tələbələrin yaşı saxlanılır, amma bəzilərinin yaşı məlum deyil (NULL).
| id | name | age |
|---|---|---|
| 1 | Alex Lin | 20 |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 19 |
| 4 | Otto Art | 22 |
| 5 | Liam Park | NULL |
Ən gənc və ən yaşlı tələbəni tapmaq istəyirik.
SELECT
MIN(age) AS youngest_student,
MAX(age) AS eldest_student
FROM students;
Nəticə:
| youngest_student | eldest_student |
|---|---|
| 19 | 22 |
Bu sorğu yalnız yaşı olan tələbələr üçün minimum və maksimum yaş qaytaracaq. NULL yenə də sayılmayacaq.
Xüsusiyyətlər və tələlər
NULL ilə aqreqat işləyəndə aşağıdakı məqamlara diqqət et:
SUM()vəAVG()üçünNULLnəzərə alınmır. Bu, "boş" dəyərləri hesablara qatmaq istəməyəndə faydalıdır.- Sütunda
NULLolan sətrləri də saymaq lazımdırsa,COUNT(*)istifadə et. MIN()vəMAX()istifadə edəndə,NULLnəticəyə təsir etmir. Amma bütün sütunNULLolsa, nəticə dəNULLolacaq.
NULL ilə işləmək üçün məsləhətlər
- Tapşırığın özəlliyini nəzərə al. Sorğunda
NULL-u nəzərə almaq lazımdırmı, bunu başa düşmək vacibdir. Bəzən, məsələnAVG()üçün, onları saymamaq lazımdır. Bəzən isə, ümumi say üçün,NULLolan sətrləri də hesaba qatmaq vacibdir. - Lazım olsa
COALESCE()istifadə et. HesablamalardaNULL-u default dəyərlə əvəz etmək lazımdırsa,COALESCE()sənin dostundur (amma bu, artıq növbəti leksiyanın mövzusudur). COUNT(*)vəCOUNT(column)-u qarışdırma. Bu, yeni başlayanların klassik səhvidir. Birincisi bütün sətrləri sayır, ikincisi isə yalnız dəyəri olanları.
Artıq bilirsən ki, səssizcə gizlənən NULL aqreqatlara necə təsir edə bilər. Bu bilik sənə xoşagəlməz sürprizlərdən qaçmağa və NULL-dan öz xeyrinə istifadə etməyə imkan verəcək. Növbəti leksiyada COALESCE() kimi güclü aləti öyrənəcəyik ki, NULL ilə daha effektiv işləyə biləsən.
GO TO FULL VERSION