După ce am definit grupuri cu cuvântul cheie GROUP BY, putem selecta mai multe informații despre fiecare dintre ele, de exemplu: câte persoane (rânduri) există în cadrul fiecărei familii (grup de rânduri)?
SELECT lastname, count(*) -- count() este o funcție care numără valori sau rânduri
FROM person
GROUP BY lastname;
Vedem că în micul nostru exemplu de bază de date există o familie cu trei membri, alta cu doi membri și toate celelalte sunt formate din exact 1 membru.
Ce se întâmplă în spatele scenei în timpul executării comenzii?
- Sunt preluate toate cele zece rânduri ale persoanei din tabel (în comanda de mai sus, nu există o clauză WHERE).
- Rândurile sunt aranjate în șapte grupuri în funcție de valoarea coloanei numele de familie.
- Fiecare grup cu toate rândurile sale este trecut la clauza SELECT.
- SELECT construiește un rând rezultat pentru fiecare grup primit (în bazele de date din „lumea reală”, fiecare dintre grupuri poate conține mii de rânduri).
În pasul 4 este generat exact un rând rezultat per grup. Deoarece SELECT creează un singur rând rezultat per grup, nu este posibil să se afișeze valori ale unor astfel de coloane care pot diferi de la rând la rând, de exemplu, prenumele. SELECT poate afișa numai acele valori pentru care este asigurat că sunt identice în toate rândurile grupului: coloana „criterion”.
-- Nu este posibil să afișați „firstname” unui grup! „firstname” este un atribut al unei singure persoane.
-- În cadrul unui grup, „firstname” variază de la rând la rând.
-- SGBD-ul ar trebui să recunoască această problemă și ar trebui să emită un mesaj de eroare.
SELECT lastname, firstname
FROM person
GROUP BY lastname;
-- Un indiciu pentru utilizatorii MySQL:
-- Pentru a primi rezultate corecte (mesajul de eroare) trebuie să dezactivați o funcție specială de performanță lansând comanda
-- set sql_mode = 'ONLY_FULL_GROUP_BY'; sau setați-o în bancul de lucru sau în fișierul ini.
Cu toate acestea, putem obține informații despre coloanele non-criterion. Dar aceste informații sunt mai generalizate. SGBD oferă un grup special de funcții care construiesc o valoare dintr-un set de rânduri. Luați în considerare funcția avg(), care calculează media aritmetică a valorilor numerice. Această funcție primește un nume de coloană și operează pe un set de rânduri. Dacă comanda noastră în cauză conține o clauză GROUP BY, funcția avg() calculează o valoare per grup – nu o valoare pe toate rândurile, ca de obicei. Deci este posibil să se arate rezultatul unor astfel de funcții împreună cu valorile coloanei „criterion”.
Iată o listă – incompletă – de astfel de funcții: count(), max(), min(), sum(), avg(). Nu toate funcțiile sunt de acest fel, de ex. funcția concat(), care concatenează două șiruri de caractere, operează pe rânduri individuale și creează o valoare pe rând.
-- compute avg() by your own formula
SELECT lastname, sum(weight) / count(weight) as "Mean weight 1", avg(weight) as "Mean weight 2"
FROM person
GROUP BY lastname;
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns