Par définition, ORDER BY est traité après groupement avec GROUP BY. Par définition, la façon conceptuelle dont toute instruction SELECT est traitée est :
- Calculer le produit cartésien de toutes les tables référencées dans la clause FROM
- Appliquez les critères de jointure de la clause FROM pour filtrer les résultats
- Appliquez les critères de filtrage dans la clause WHERE pour filtrer davantage les résultats
- Regroupez les résultats en sous-ensembles en fonction de la clause GROUP BY, en regroupant les résultats sur une seule ligne pour chacun de ces sous-ensembles et en calculant les valeurs de toutes les fonctions d'agrégation --
SUM()
,MAX()
,AVG()
, etc. -- pour chacun de ces sous-ensembles. Notez que si aucune clause GROUP BY n'est spécifiée, les résultats sont traités comme s'il existait un seul sous-ensemble et toutes les fonctions d'agrégation s'appliquent à l'ensemble des résultats, en le réduisant à une seule ligne. - Filtrez les résultats désormais groupés en fonction de la clause HAVING.
- Trier les résultats en fonction de la clause ORDER BY.
Les seules colonnes autorisées dans le jeu de résultats d'un SELECT avec une clause GROUP BY sont, bien sûr,
- Les colonnes référencées dans la clause GROUP BY
- Fonctions d'agrégation (telles que
MAX()
) - littéral/constantes
- expressions dérivées de l'un des éléments ci-dessus.
Seules les implémentations SQL cassées autorisent des choses comme select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— les références aux colonnes a, b et c n'ont pas de sens/indéfinies, étant donné que les groupes individuels ont été réduits à une seule ligne,