Por definição, ORDER BY é processado depois agrupamento com GROUP BY. Por definição, a forma conceitual como qualquer instrução SELECT é processada é:
- Calcule o produto cartesiano de todas as tabelas referenciadas na cláusula FROM
- Aplique os critérios de junção da cláusula FROM para filtrar os resultados
- Aplique os critérios de filtro na cláusula WHERE para filtrar ainda mais os resultados
- Agrupe os resultados em subconjuntos com base na cláusula GROUP BY, recolhendo os resultados em uma única linha para cada um desses subconjuntos e calculando os valores de qualquer função agregada --
SUM()
,MAX()
,AVG()
, etc. -- para cada um desses subconjuntos. Observe que, se nenhuma cláusula GROUP BY for especificada, os resultados serão tratados como se houvesse um único subconjunto e todas as funções de agregação se aplicarão a todo o conjunto de resultados, reduzindo-o a uma única linha. - Filtre os resultados agora agrupados com base na cláusula HAVING.
- Classifique os resultados com base na cláusula ORDER BY.
As únicas colunas permitidas no conjunto de resultados de um SELECT com uma cláusula GROUP BY são, obviamente,
- As colunas referenciadas na cláusula GROUP BY
- Funções agregadas (como
MAX()
) - literais/constantes
- expressões derivadas de qualquer um dos itens acima.
Apenas implementações SQL quebradas permitem coisas como
select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— as referências às colunas a, b e c não têm sentido/indefinidas, dado que os grupos individuais foram reduzidos a uma única linha,