Per definizione, ORDER BY viene elaborato dopo raggruppamento con GROUP BY. Per definizione, il modo concettuale in cui viene elaborata qualsiasi istruzione SELECT è:
- Calcola il prodotto cartesiano di tutte le tabelle a cui si fa riferimento nella clausola FROM
- Applica i criteri di unione dalla clausola FROM per filtrare i risultati
- Applica i criteri di filtro nella clausola WHERE per filtrare ulteriormente i risultati
- Raggruppa i risultati in sottoinsiemi in base alla clausola GROUP BY, comprimendo i risultati in una singola riga per ciascuno di questi sottoinsiemi e calcolando i valori di qualsiasi funzione aggregata --
SUM()
,MAX()
,AVG()
, ecc. -- per ciascuno di questi sottoinsiemi. Tieni presente che se non viene specificata alcuna clausola GROUP BY, i risultati vengono trattati come se esistesse un unico sottoinsieme e qualsiasi funzione di aggregazione si applica all'intero insieme di risultati, comprimendolo in un'unica riga. - Filtra i risultati ora raggruppati in base alla clausola HAVING.
- Ordina i risultati in base alla clausola ORDER BY.
Le uniche colonne consentite nel set di risultati di un SELECT con una clausola GROUP BY sono, ovviamente,
- Le colonne a cui si fa riferimento nella clausola GROUP BY
- Funzioni aggregate (come
MAX()
) - letterale/costanti
- espressioni derivate da una delle precedenti.
Solo le implementazioni SQL non funzionanti consentono cose come select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— i riferimenti alle colonne a, b e c sono privi di significato/indefinito, dato che i singoli gruppi sono stati compressi in un'unica riga,