SELECT nom_courant, COUNT(*) as nombre
FROM Animal
INNER JOIN Espece ON Espece.id = Animal.espece_id
WHERE SUBSTRING(nom_courant, 1, 1) = 'C'
-- Une
condition dans WHERE
GROUP BY nom_courant
HAVING nombre > 6;
-- Et une
dans HAVING
Il est cependant préférable, et de loin, d'utiliser la clause WHERE autant que possible, c'est-à-dire pour toutes les conditions, sauf
celles utilisant une fonction d'agrégation. En effet, les conditions HAVING ne sont absolument pas optimisées, au contraire des
conditions WHERE.
En résumé
Utiliser GROUP BY en combinaison avec une fonction d'agrégation permet de regrouper les lignes selon un ou plusieurs
critères.
Si l'on groupe sur un seul critère, on aura autant de groupes (donc de lignes) que de valeurs différentes dans la colonne
utilisée comme critère.
Si l'on groupe sur plusieurs critères, le nombre maximum de groupes résultant est obtenu en multipliant le nombre de
valeurs différentes dans chacune des colonnes utilisées comme critère.
Selon la norme SQL, si l'on utilise GROUP BY, on ne peut avoir dans la clause SELECT que des fonctions d'agrégation,
ou des colonnes utilisées comme critère dans le GROUP BY.
L'option WITH ROLLUP permet de créer des super-groupes (ou groupes de groupe).
Une condition sur le résultat d'une fonction d'agrégation se place dans une clause HAVING, et non dans la clause
WHERE.
Partie 3 : Fonctions : nombres, chaînes et agrégats
187/414
www.openclassrooms.com
Précédent

- 187/413

Suivant