Aici vom părăsi nivelul rândurilor individuale și vom descrie afirmații care se referă la grupuri de rânduri. În contextul SQL, astfel de „grupuri de rânduri” (sau seturi de rânduri) sunt construite de clauza GROUP BY și procesate în continuare de clauza HAVING.
Constituire grupuri
Mai întâi trebuie să stabilim criterii de filtrare a rândurilor după grupuri. Pentru a face acest lucru, folosim conținutul uneia sau mai multor coloane ale tabelelor implicate. Dacă valorile sunt identice, rândurile aparțin aceluiași grup. Luați în considerare lastname în tabelul person. În exemplul nostru mic, putem insinua că persoanele cu același nume formează o familie. Deci, pentru a vedea informații despre familii, ar trebui să folosim această coloană ca un criteriu de grupare. Această grupare ne permite să punem întrebări referitoare la familii întregi, cum ar fi „Ce familii există?”, „Câte familii există?”, „Câte persoane sunt în fiecare familie?”. Toate acestea sunt întrebări despre întregul grup (care înseamnă familie), nu despre rânduri individuale (care înseamnă persoana).
În sintaxa SQL, criteriul este specificat după cuvântul cheie GROUP BY și constă din unul sau mai multe nume de coloane.
SELECT ... -- ca de obicei
FROM ... -- ca de obicei (opțional plus JOIN)
GROUP BY <column-name> -- opționall mai multe nume de coloane
... -- opțional alte elemente ale comenzii SELECT
;
Exemplul nostru concret despre familii arată astfel:
SELECT lastname
FROM person
GROUP BY lastname;
Interogarea preia șapte „nume de familie” din cele zece rânduri. Există mai multe persoane cu numele de familie „Goldstein” sau „de Winter”.
Putem prelua aceleași șapte „nume de familie” prin aplicarea cuvântului cheie DISTINCT într-un SELECT fără GROUP BY.
SELECT DISTINCT lastname
FROM person;
-- no GROUP BY clause
Ce face diferența? Cuvântul cheie DISTINCT este limitat la eliminarea valorilor duplicate. Nu poate iniția calcule pe alte rânduri și coloane ale setului de rezultate. În schimb, GROUP BY aranjează suplimentar rândurile primite intermediare ca mai multe grupuri și oferă posibilitatea de a obține informații despre fiecare dintre aceste grupuri. Este chiar și cazul că în cadrul acestor grupuri sunt disponibile toate coloanele, nu doar coloana-„criteriu”. Pentru a confirma această afirmație despre „toate” coloanele, folosim weight, care nu este coloana-„criteriu”.
SELECT lastname, avg(weight) -- avg() is a function to compute the arithmetic mean of numerical values
FROM person
GROUP BY lastname;
Rezultatul arată cele șapte nume de familie – așa cum s-a văzut înainte – plus greutatea medie a fiecărei familii. Greutatea persoanelor individuale nu este afișată. (În grupurile cu exact o singură persoană, greutatea medie a grupului este, desigur, identică cu greutatea unei singure persoane.)
Gruparea pe mai multe coloane
Dacă este necesar, putem defini gruparea pe mai multe coloane. În acest caz, ne putem imagina concatenarea coloanelor ca regulă de grupare.
-- Group over one column: place_of_birth leads to 6 resulting rows
SELECT place_of_birth, count(*)
FROM person
GROUP BY place_of_birth;
-- Group over two columns: place_of_birth plus lastname leads to 8 resulting rows with Richland and SF shown twice
SELECT place_of_birth, lastname, count(*)
FROM person
GROUP BY place_of_birth, lastname;
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns