Por definición, ORDER BY se procesa después agrupar con GROUP BY. Por definición, la forma conceptual en que se procesa cualquier instrucción SELECT es:
- Calcule el producto cartesiano de todas las tablas a las que se hace referencia en la cláusula FROM
- Aplique los criterios de combinación de la cláusula FROM para filtrar los resultados
- Aplique los criterios de filtro en la cláusula WHERE para filtrar aún más los resultados
- Agrupe los resultados en subconjuntos según la cláusula GROUP BY, colapsando los resultados en una sola fila para cada subconjunto y calculando los valores de cualquier función agregada --
SUM()
,MAX()
,AVG()
, etc., para cada uno de esos subconjuntos. Tenga en cuenta que si no se especifica la cláusula GROUP BY, los resultados se tratan como si hubiera un solo subconjunto y cualquier función agregada se aplica a todo el conjunto de resultados, colapsándolo en una sola fila. - Filtrar los resultados ahora agrupados según la cláusula HAVING.
- Ordenar los resultados según la cláusula ORDER BY.
Las únicas columnas permitidas en el conjunto de resultados de un SELECT con una cláusula GROUP BY son, por supuesto,
- Las columnas a las que se hace referencia en la cláusula GROUP BY
- Funciones agregadas (como
MAX()
) - literal/constantes
- expresiones derivadas de cualquiera de las anteriores.
Solo las implementaciones de SQL rotas permiten cosas como select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— las referencias a las columnas a, b y c carecen de sentido/no están definidas, dado que los grupos individuales se han colapsado en una sola fila,