Təsəvvür elə, minlərlə sətrlik məlumatla işləyirsən — orda mənanı necə tapmaq olar? Bax, burada səhnəyə GROUP BY operatoru çıxır — SQL-in əsl dirijoru. O, pərakəndə məlumatları götürüb, onları səliqəli melodiyaya çevirir: sayır, qruplaşdırır, yekunlaşdırır. Bilmək istəyirsən, hər bir müştəri neçə sifariş edib, hər kursda neçə tələbə var, ya da maaşlar şöbələr üzrə necə bölünüb? Bütün bunlar GROUP BY-ın işidir. Bu gün öyrənəcəyik ki, onunla necə dostlaşmaq və cədvəllərindən maksimum fayda çıxarmaq olar.
Qruplaşdırma — eyni və ya bir neçə sütunda eyni dəyəri olan sətrləri birləşdirib, məntiqi qruplar yaratmaq prosesidir. Bu, aggregat funksiyaları hər qrupa ayrıca tətbiq etməyə imkan verir.
Təsəvvür elə, səndə işçilərin cədvəli var və hər şöbə üzrə orta maaşı bilmək istəyirsən. Bir şöbə — bir qrup. SQL GROUP BY-dan istifadə edib işçilər cədvəlini şöbələrə görə qruplaşdırır, sonra isə hər qrupa AVG() tətbiq edir.
GROUP BY sintaksisi
SQL-də qruplaşdırmanın əsas qaydası: əgər GROUP BY istifadə edirsənsə, aggregat funksiyaya daxil olmayan hər bir sütun GROUP BY-da göstərilməlidir.
Sintaksis:
SELECT sütun1,
aggregat_funksiyası(sütun2)
FROM cədvəl
GROUP BY sütun1;
İş addımları:
- Qruplaşdırmaq istədiyin sütunu
GROUP BY-da göstər. - Qruplarda dəyərləri hesablamaq üçün aggregat funksiyalardan istifadə et.
SELECT-də olan, amma aggregat funksiyaya daxil olmayan bütün sütunlarGROUP BY-da olmalıdır. Bəli, SQL bu məsələdə sərtdir və unutsa, səhv mesajı ilə yadına salacaq.
Nümunə: Tələbələrin fakültələr üzrə qruplaşdırılması
Tutaq ki, bizdə tələbələr haqqında məlumat saxlayan students cədvəli var:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
İndi isə hər fakültə üzrə orta balı (GPA) bilmək istəyirik. Bunun üçün GROUP BY ilə sorğu yazırıq:
SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Nəticə:
| faculty | avg_gpa |
|---|---|
| ComputerSci | 3.9 |
| Math | 3.7 |
| Physics | 3.7 |
SQL əvvəlcə məlumatları faculty sütununun dəyərinə görə qruplaşdırdı, sonra isə hər qrupa AVG() funksiyasını tətbiq etdi.
GROUP BY ilə işləməyin özəllikləri
SELECT-də sütunlara tələblər
SQL tələb edir ki, SELECT-də göstərdiyin, amma aggregat funksiyalarda istifadə etmədiyin bütün sütunlar (SUM(), COUNT() və s. kimi) GROUP BY-da qeyd olunsun. Çünki qruplaşdırma olmadan SQL hansı dəyərləri göstərməli olduğunu başa düşmür.
Aşağıdakı sorğunu icra etməyə çalış və səhv alacaqsan:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;
Səhv: name sütunu GROUP BY-da göstərilməyib. Bunu düzəltmək üçün name-i GROUP BY-ya əlavə et:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;
Amma bu artıq məlumatı konkret tələbə səviyyəsində qruplaşdıracaq — bu isə əvvəl istədiyimiz deyildi.
- Bir neçə sütuna görə qruplaşdırma
Məlumatları təkcə bir sütuna görə yox, bir neçə sütuna görə də qruplaşdıra bilərsən. Məsələn, fakültədən əlavə tələbələri adlarına görə də qruplaşdırmaq istəyirik. Sadəcə ikinci sütunu GROUP BY-ya əlavə et:
SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;
İlkin cədvəl:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Nəticə:
| faculty | name | avg_gpa |
|---|---|---|
| ComputerSci | Alex Lin | 3.8 |
| ComputerSci | Anna Song | 4.0 |
| Math | Maria Chi | 3.5 |
| Math | Otto Art | 3.9 |
| Physics | Liam Park | 3.7 |
- Bir neçə aggregat funksiyadan istifadə ilə qruplaşdırma
Özünü tək bir funksiya ilə məhdudlaşdırma! Məsələn, fakültədə neçə tələbə olduğunu saymaq və orta balı hesablamaq istəyirik:
SELECT faculty,
COUNT(*) AS student_count,
AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
İlkin cədvəl:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Nəticə:
| faculty | student_count | avg_gpa |
|---|---|---|
| ComputerSci | 2 | 3.9 |
| Math | 2 | 3.7 |
| Physics | 1 | 3.7 |
SQL-də qruplaşdırmanın özəllikləri: nəyi seçmək olar, nəyi olmaz
Qruplaşdırma ilə sorğular yazmaq asandır, amma çox güman ki, sorğularının yarısı işləməyəcək. Qruplaşdırma bir az fərqli baş verir, biz beynimizdə necə təsəvvür ediriksə, elə olmur.
Əgər SQL-sorğunda GROUP BY varsa, nəticə sütunlarının hamısını hesablanan ifadələr kimi düşün. SELECT-dəki sütunlar yalnız iki tip ola bilər:
- qrup sütunlarının əsasında aggregat funksiyalarla hesablanır.
- GROUP BY-dan götürülür — onlar üzrə qruplaşdırma olmalıdır.
Əgər tələbələr cədvəlinə GROUP-BY-sorğu edirsənsə, nəticə cədvəlində konkret tələbələr ola bilməz! Orda orta boy, orta çəki, orta bal ola bilər. Belə kod işləməyəcək:
SELECT faculty, name
FROM students
GROUP BY faculty;
Gəlin başa düşək niyə.
GROUP BY faculty operatoru students cədvəlindəki tələbələri faculty eyni olan qruplara böləcək. Hər qrupda tələbələrin faculty-si eyni olduğuna görə, demək olar ki, tələbə qrupunun faculty atributu var. Amma name hamıda fərqlidir. Ona görə də qrupun name atributu yoxdur.
GROUP BY faculty, gender operatoru students cədvəlindəki tələbələri faculty və gender eyni olan qruplara böləcək. Hər qrupda tələbələrin faculty və gender-i eyni olacaq. Deməli, tələbə qrupunun faculty və gender atributları var. Amma qrupun ümumi name-i yenə yoxdur.
Belə yazmaq olar:
SELECT faculty, gender
FROM students
GROUP BY faculty, gender;
Hətta belə də olar:
SELECT
faculty,
gender,
AVG(age) as group_avg_age, -- Dəyər tələbə qrupunun age dəyərlərinə əsasən hesablanır
MAX(high) as group_high -- Dəyər tələbə qrupunun high dəyərlərinə əsasən hesablanır
FROM students
GROUP BY faculty, gender;
Amma sadəcə age və high-ı SELECT-də istifadə etmək olmaz.
GROUP BY istifadə edərkən tipik səhvlər
GROUP BY ilə sorğular yazmağa başlayanda, qarşılaşa biləcəyin bir neçə tələ var:
Bütün sütunlar
SELECT-də göstərilməyib. Unutma, aggregat olmayan hər sütunGROUP BY-da olmalıdır. Yoxsa SQL onu necə göstərməli olduğunu anlamayacaq.NULL-a görə qruplaşdırma.NULLdəyərlər ayrıca qrup sayılır. Əgər sütundaNULLvarsa, SQL onun üçün ayrıca qrup yaradacaq.Artıq qruplar. Əgər təsadüfən
GROUP BY-a çox sütun əlavə etsən, nəticələr çox detallı olacaq və analiz etmək çətinləşəcək.
Artıq bilirsən ki, GROUP BY ilə məlumatları necə effektiv qruplaşdırmaq olar. Bu, SQL-də ən güclü alətlərdən biridir və aggregat məlumatlarla işləməyi və strukturlaşdırılmış hesabatlar yaratmağı asanlaşdırır. Növbəti dərsdə qruplaşdırmanın sehrinə daha dərindən baxacağıq və HAVING ilə əlavə filtrləri necə qurmaq olar, onu öyrənəcəyik.
GO TO FULL VERSION