Gruparea
Operatorii GROUP BY și HAVING permit gruparea datelor. Aceștia sunt utilizați în cadrul comenzii SELECT:
SELECT coloane
FROM tabela
[WHERE conditie_filtrare_randuri]
[GROUP BY coloane_pentru_grupare]
[HAVING conditie_filtrare_grupuri]
[ORDER BY coloane_pentru_sortare]
GROUP BY
Operatorul GROUP BY determină modul în care rândurile vor fi grupate.
De exemplu, să grupăm produsele în funcție de producător.
SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer
Prima coloană în expresia SELECT - Manufacturer reprezintă numele grupului, iar al doilea coloană - ModelsCount reprezintă rezultatul funcției Count, care calculează numărul de rânduri din grup.

Și dacă în expresia SELECT se fac selecții pe unul sau mai multe coloane și se utilizează funcții de agregare, atunci este necesar să se utilizeze expresia GROUP BY. Astfel, următorul exemplu nu va funcționa, deoarece nu conține o expresie de grupare:
SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
Operatorul GROUP BY poate realiza gruparea după mai multe coloane. Astfel, să adăugăm o grupare după cantitatea de produse:
SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer, ProductCount
Trebuie să luați în considerare că expresia GROUP BY trebuie să urmeze după expresia WHERE, dar înainte de expresia ORDER BY:
SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price > 30000
GROUP BY Manufacturer
ORDER BY ModelsCount DESC

Filtrarea grupurilor - HAVING
Operatorul HAVING permite filtrarea grupurilor, adică determină care grupuri vor fi incluse în rezultatul final.
Utilizarea HAVING este în mare măsură similară cu aplicarea WHERE. Diferența constă în faptul că, în timp ce WHERE este folosit pentru filtrarea rândurilor, HAVING este folosit pentru filtrarea grupurilor.
De exemplu, să găsim toate grupurile de produse în funcție de producători, pentru care sunt definite mai mult de 1 model:
SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer
HAVING COUNT(*) > 1

Într-o singură comandă, puteți combina și expresiile WHERE și HAVING:
SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING COUNT(*) > 1;
Adică, în acest caz, mai întâi se filtrează rândurile: se selectează produsele ale căror valoare totală este mai mare de 80000. Apoi, produsele selectate sunt grupate în funcție de producători. În continuare, grupurile în sine sunt filtrate - sunt selectate acele grupuri care conțin mai mult de 1 model.
Dacă este necesar să se efectueze o sortare, atunci expresia ORDER BY urmează după expresia HAVING:
SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING SUM(ProductCount) > 2
ORDER BY Units DESC;
Aici, gruparea se face în funcție de producători, se selectează numărul de modele pentru fiecare producător (Models) și numărul total de toate produsele pentru toate aceste modele (Units). La final, grupurile sunt sortate în funcție de numărul de produse în ordine descrescătoare.
