Cum funcționează
Structura de bază e cea de la tabelul Carti. Aici apar ordonarea
şi, mai important, gruparea — cea mai grea idee din toată categoria de baze de date.
c) ORDER BY — ordonarea rezultatelor
ORDER BY An_aparitie ASC
ASC = crescător (implicit, poate fi omis), DESC = descrescător. Ordonarea se scrie
întotdeauna la final, după WHERE. Ordinea părților unei interogări e fixă:
SELECT ... FROM ... WHERE ... GROUP BY ... ORDER BY ...
Rezultatul: Gladiator (2000), A Beautiful Mind (2001), Slumdog Millionaire (2008).
d) GROUP BY — de la rânduri la categorii
Cerința nu mai cere rânduri, ci un rezultat pentru fiecare categorie. Asta face GROUP BY:
adună rândurile cu aceeaşi valoare într-un singur grup, apoi calculează ceva pentru fiecare grup.
SELECT Gen, AVG(Durata) FROM Filme GROUP BY Gen;
Drama -> 120, 135, 155 -> AVG = 136.67
Fictiune -> 140, 116 -> AVG = 128
Thriller -> 151 -> AVG = 151
Din 6 rânduri ies 3, câte unul pentru fiecare gen distinct.
Funcțiile de agregare sunt cele care calculează pe un grup întreg:
| Funcţie |
Ce face |
COUNT(*) |
câte rânduri |
SUM(x) |
suma valorilor |
AVG(x) |
media |
MIN(x) / MAX(x) |
cea mai mică / mare valoare |
Regula de aur a lui GROUP BY: în SELECT pot apărea doar coloanele după care grupezi şi
funcții de agregare. SELECT Titlu, AVG(Durata) ... GROUP BY Gen n-are sens — într-un gen sunt mai
multe titluri, deci ce titlu ar trebui afişat? Unele baze de date dau eroare, altele aleg un titlu
la întâmplare, ceea ce e şi mai rău.
AS Durata_medie dă un nume coloanei din rezultat. Nu e obligatoriu, dar fără el coloana s-ar numi
AVG(Durata).
Fără GROUP BY, o funcţie de agregare calculează pe tot tabelul: SELECT AVG(Durata) FROM Filme dă media tuturor celor 6 filme, un singur număr.
Greșeli frecvente
GROUP BY uitat — SELECT Gen, AVG(Durata) FROM Filme dă un singur rând, cu un gen ales
arbitrar.
- Coloane care nu sunt în
GROUP BY — cea mai frecventă greşeală conceptuală.
ORDER BY pus înaintea lui WHERE — eroare de sintaxă; ordinea clauzelor e fixă.
WHERE folosit pentru a filtra grupuri — pentru condiții pe rezultatul agregării se foloseşte
HAVING, nu WHERE.
Gen = 'drama' — în multe baze de date comparația ține cont de majuscule, iar în tabel scrie
Drama.