CodeGym /Kurslar /SQL SELF /Məlumatların qruplaşdırılması (GROUP BY): sintaksis və st...

Məlumatların qruplaşdırılması (GROUP BY): sintaksis və struktur

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

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ı:

  1. Qruplaşdırmaq istədiyin sütunu GROUP BY-da göstər.
  2. Qruplarda dəyərləri hesablamaq üçün aggregat funksiyalardan istifadə et.
  3. SELECT-də olan, amma aggregat funksiyaya daxil olmayan bütün sütunlar GROUP 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

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

  1. 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
  1. 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 facultygender eyni olan qruplara böləcək. Hər qrupda tələbələrin facultygender-i eyni olacaq. Deməli, tələbə qrupunun facultygender 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ə agehighSELECT-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:

  1. Bütün sütunlar SELECT-də göstərilməyib. Unutma, aggregat olmayan hər sütun GROUP BY-da olmalıdır. Yoxsa SQL onu necə göstərməli olduğunu anlamayacaq.

  2. NULL-a görə qruplaşdırma. NULL dəyərlər ayrıca qrup sayılır. Əgər sütunda NULL varsa, SQL onun üçün ayrıca qrup yaradacaq.

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

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