GROUP BY
La clause SQL qui regroupe les lignes partageant une même valeur en une seule ligne par groupe, pour que des fonctions d'agrégation comme COUNT, SUM et AVG se calculent par groupe plutôt que sur toute la table.
La règle qui piège les débutants : chaque colonne du SELECT doit soit appartenir au regroupement, soit être un agrégat. MySQL a longtemps toléré le contraire et renvoyait alors une valeur arbitraire, ce qui a causé plus de bugs silencieux que presque n'importe quoi d'autre. WHERE filtre avant le regroupement, HAVING après — c'est pourquoi seul HAVING peut comparer un agrégat. La base choisit ensuite entre agrégation par hachage et tri selon la taille et les index. Les extensions GROUPING SETS, ROLLUP et CUBE produisent plusieurs niveaux de regroupement en une seule passe — le fondement même des rapports OLAP. Les fonctions fenêtrées font autre chose : elles agrègent sans fusionner les lignes.