Məzmuna keç
Educora
Başlanğıc14 dəq6 / 22

Aqreqat funksiyalar: COUNT, SUM, AVG, MIN, MAX

Çoxlu sətri bir ədədə çevir: sətirləri say, cəmlə, orta qiyməti, ən kiçik və ən böyük qiyməti tap.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Beş əsas aqreqat funksiyadan istifadə etmək
  • COUNT(*), COUNT(sütun) və COUNT(DISTINCT sütun) arasındakı fərqi izah etmək
  • Aqreqatları WHERE ilə birlikdə tətbiq etmək və NULL-un təsirini bilmək

Müəllimə hər şagirdin balı deyil, sinfin orta balı lazımdır. Mağaza sahibi hər sifarişə baxmaq yerinə ümumi satışı bilmək istəyir. Belə suallara cavab sətirlər siyahısı deyil, bir ədəddir. SQL-də bu ədədləri aqreqat funksiyalar hesablayır.

Aqreqat funksiya nədir?

Tərif
Aqreqat funksiya

Çoxlu sətrin qiymətlərini götürüb onlardan bir nəticə hesablayan funksiya. Adi funksiya (məsələn, ROUND) hər sətir üçün ayrıca işləyir, aqreqat isə bütün sətirlər üçün birdən.

FunksiyaNə qaytarır
COUNT(*)sətirlərin sayını
COUNT(x)x-in NULL olmayan qiymətlərinin sayını
SUM(x)qiymətlərin cəmini
AVG(x)orta qiyməti
MIN(x)ən kiçik qiyməti
MAX(x)ən böyük qiyməti

COUNT: saymaq

COUNT-un üç forması var. COUNT(*) bütün sətirləri sayır. COUNT(email) yalnız email sütununda qiyməti olan sətirləri sayır — iki şagirdin e-poçtu NULL olduğu üçün nəticə 10-dur. COUNT(DISTINCT city) isə müxtəlif şəhərlərin sayını verir.

SQL
SELECT COUNT(*)             AS students,
       COUNT(email)         AS with_email,
       COUNT(DISTINCT city) AS cities
FROM students;
▸ Gözlənilən nəticə
students | with_email | cities
12 | 10 | 7

SUM, AVG, MIN və MAX

Bir sorğuda bir neçə aqreqatı birlikdə yazmaq olar. Orta qiymət çox vaxt uzun kəsr olur (burada 293,558), ona görə onu ROUND ilə yuvarlaqlaşdırırıq. Nəticə həmişə bir sətirdir, çünki bütün cədvəl bir qrup kimi yekunlaşdırılır.

SQL
SELECT SUM(stock)            AS total_items,
       ROUND(AVG(price), 2)  AS avg_price,
       MIN(price)            AS cheapest,
       MAX(price)            AS most_expensive
FROM products;
▸ Gözlənilən nəticə
total_items | avg_price | cheapest | most_expensive
1086 | 293.56 | 3.2 | 1450

MIN və MAX təkcə ədədlərlə deyil, mətn və tarixlərlə də işləyir. YYYY-MM-DD formatındakı tarixlər üçün MIN ən erkən, MAX isə ən son tarixi verir.

SQL
SELECT MIN(order_date) AS first_order,
       MAX(order_date) AS last_order
FROM orders;
▸ Gözlənilən nəticə
first_order | last_order
2025-01-15 | 2025-07-07

Aqreqatlarla hesablamalar

Aqreqatın nəticəsi adi ədəddir, ona görə onunla hesablama aparmaq olar. MAX(age) - MIN(age) ən böyük və ən kiçik yaş arasındakı fərqi verir. E-poçtu olan şagirdlərin faizini tapmaq üçün COUNT(email)-i COUNT(*)-a bölüb 100-ə vururuq. Diqqət: 100 * 10 / 12 tam ədədlərin bölünməsidir və 83 verir; dəqiq nəticə üçün 100.0 yazırıq.

SQL
SELECT MAX(age) - MIN(age) AS age_range,
       100 * COUNT(email) / COUNT(*) AS int_pct,
       ROUND(100.0 * COUNT(email) / COUNT(*), 1) AS pct_with_email
FROM students;
▸ Gözlənilən nəticə
age_range | int_pct | pct_with_email
3 | 83 | 83.3
int_pct tam ədəd bölməsi səbəbindən kəsr hissəni itirib.

Aqreqatlar və WHERE

WHERE aqreqatdan əvvəl işləyir: əvvəlcə sətirlər süzülür, sonra yalnız qalan sətirlər üzərində hesablama aparılır. Aşağıda yalnız 1 nömrəli kursun (Algebra) yazılışlarını götürürük: 4 şagird, orta bal 87,3.

SQL
SELECT COUNT(*)             AS enrollments,
       ROUND(AVG(score), 1) AS avg_score,
       MIN(score)           AS min_score,
       MAX(score)           AS max_score
FROM enrollments
WHERE course_id = 1;
▸ Gözlənilən nəticə
enrollments | avg_score | min_score | max_score
4 | 87.3 | 75 | 97
Nümunə tapşırıq

Anbardakı bütün malların ümumi dəyəri nə qədərdir?

Həllini göstər
Hər məhsulun dəyəri price * stock-dur.
Aqreqatın içində ifadə yazmaq olar: SUM(price * stock).
VBİS əvvəlcə hər sətir üçün hasili hesablayır, sonra onları toplayır: 40260,6.
SQL
SELECT SUM(price * stock) AS warehouse_value
FROM products;
▸ Gözlənilən nəticə
warehouse_value
40260.6
SQL
SELECT AVG(age) AS avg_age
FROM students;
▸ Gözlənilən nəticə
avg_age
15.5
Tapşırıq

1 nömrəli kurs (Algebra) üzrə yekunu hesabla: yazılışların sayı (students), 1 onluq rəqəmə qədər yuvarlaqlaşdırılmış orta bal (avg_score) və ən yüksək bal (best).

Tapşırıq · SQL
SELECT COUNT(*) AS students
       -- add avg_score and best
FROM enrollments
WHERE course_id = 1;
▸ Gözlənilən nəticə
students | avg_score | best
4 | 87.3 | 97
Tapşırıq

Electronics kateqoriyası üçün məhsulların sayını (products), anbardakı ümumi ədədi (total_stock) və ən aşağı qiyməti (cheapest) tap.

Tapşırıq · SQL
SELECT
  -- three aggregates here
FROM products
WHERE category = 'Electronics';
▸ Gözlənilən nəticə
products | total_stock | cheapest
4 | 63 | 120.5

Əsas fikirlər

  • Aqreqat funksiya çoxlu sətirdən bir nəticə hesablayır: COUNT, SUM, AVG, MIN, MAX.
  • COUNT(*) bütün sətirləri, COUNT(x) NULL olmayanları, COUNT(DISTINCT x) fərqli qiymətləri sayır.
  • WHERE aqreqatdan əvvəl işləyir — hesablama yalnız süzülmüş sətirlər üzərində aparılır.
  • Aqreqatlar (COUNT(*)-dan başqa) NULL qiymətləri buraxır.
  • Aqreqatı adi sütunla GROUP BY-sız qarışdırma — bu, əksər VBİS-lərdə xətadır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
students cədvəlində COUNT(*) 12, COUNT(email) isə 10 verir. Niyə?