- Beş əsas aqreqat funksiyadan istifadə etmək
COUNT(*),COUNT(sütun)vəCOUNT(DISTINCT sütun)arasındakı fərqi izah etmək- Aqreqatları
WHEREilə 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?
Ç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.
| Funksiya | Nə 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.
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.
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.
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.
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.
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
Anbardakı bütün malların ümumi dəyəri nə qədərdir?
Həllini göstərHəllini gizlət
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.
SELECT SUM(price * stock) AS warehouse_value
FROM products;▸ Gözlənilən nəticə
warehouse_value 40260.6
SELECT AVG(age) AS avg_age
FROM students;▸ Gözlənilən nəticə
avg_age 15.5
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).
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
Electronics kateqoriyası üçün məhsulların sayını (products), anbardakı ümumi ədədi (total_stock) və ən aşağı qiyməti (cheapest) tap.
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)NULLolmayanları,COUNT(DISTINCT x)fərqli qiymətləri sayır.WHEREaqreqatdan əvvəl işləyir — hesablama yalnız süzülmüş sətirlər üzərində aparılır.- Aqreqatlar (
COUNT(*)-dan başqa)NULLqiymə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.
students cədvəlində COUNT(*) 12, COUNT(email) isə 10 verir. Niyə?