CodeGym /Kurslar /SQL SELF /NULL-un SUM(), COUNT(), AVG(), MIN(), MAX() kimi aqreqat ...

NULL-un SUM(), COUNT(), AVG(), MIN(), MAX() kimi aqreqat funksiyalarına təsiri

SQL SELF
Səviyyə , Dərs
Mövcuddur

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()AVG() NULL-u saymır. Əgər heç olmasa bir sətrdə NULL varsa, 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()MAX() da NULL-u ötürür. Onlar yalnız NULL olmayan dəyərlər arasında minimum və ya maksimum tapır. Yəni, ən gənc işçini axtaranda, doğum tarixini doldurmayan NULL "qalib" olmayacaq.
  • COUNT(*) bütün sətrləri sayır, hətta NULL olanları da. Amma COUNT(column) yalnız həmin sütunda dəyəri olan sətrləri sayır, yəni NULL nə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:

  1. 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ı.

  1. 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.

  1. Minimum və maksimum bal: MIN()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.

  1. Sətrlərin sayı: COUNT(*)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ətta score NULL olanda da.
  • COUNT(score) isə yalnız score sü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()AVG() üçün NULL nəzərə alınmır. Bu, "boş" dəyərləri hesablara qatmaq istəməyəndə faydalıdır.
  • Sütunda NULL olan sətrləri də saymaq lazımdırsa, COUNT(*) istifadə et.
  • MIN()MAX() istifadə edəndə, NULL nəticəyə təsir etmir. Amma bütün sütun NULL olsa, nəticə də NULL olacaq.

NULL ilə işləmək üçün məsləhətlər

  1. 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ən AVG() üçün, onları saymamaq lazımdır. Bəzən isə, ümumi say üçün, NULL olan sətrləri də hesaba qatmaq vacibdir.
  2. Lazım olsa COALESCE() istifadə et. Hesablamalarda NULL-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).
  3. COUNT(*)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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION