ORDER BY wordt per definitie verwerkt na groeperen met GROUP BY. De conceptuele manier waarop een SELECT-instructie wordt verwerkt, is per definitie:
- Bereken het cartesiaanse product van alle tabellen waarnaar wordt verwezen in de FROM-clausule
- Pas de join-criteria uit de FROM-clausule toe om de resultaten te filteren
- Pas de filtercriteria in de WHERE-component toe om de resultaten verder te filteren
- Groepeer de resultaten in subsets op basis van de GROUP BY-clausule, vouw de resultaten samen tot een enkele rij voor elke dergelijke subset en bereken de waarden van alle geaggregeerde functies --
SUM()
,MAX()
,AVG()
, enz. -- voor elk van deze subsets. Houd er rekening mee dat als er geen GROUP BY-clausule is opgegeven, de resultaten worden behandeld alsof er een enkele subset is en dat alle statistische functies van toepassing zijn op de volledige resultatenset, waarbij deze wordt samengevouwen tot een enkele rij. - Filter de nu gegroepeerde resultaten op basis van de HAVING-clausule.
- Sorteer de resultaten op basis van de ORDER BY-clausule.
De enige kolommen die zijn toegestaan in de resultatenset van een SELECT met een GROUP BY-clausule zijn natuurlijk
- De kolommen waarnaar wordt verwezen in de GROUP BY-clausule
- Aggregatiefuncties (zoals
MAX()
) - letterlijk/constanten
- uitdrukkingen afgeleid van een van de bovenstaande.
Alleen kapotte SQL-implementaties staan zaken toe als select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— de verwijzingen naar kolommen a, b en c zijn betekenisloos/niet gedefinieerd, aangezien de afzonderlijke groepen zijn samengevouwen tot een enkele rij,