L'elenco di selezione non può sempre essere valutato per ultimo perché ORDER BY può utilizzare alias definiti nell'elenco di selezione, quindi devono essere eseguiti in seguito. Ad esempio:
SELECT foo+bar foobar FROM table1 ORDER BY foobar
Direi che in generale l'ordine di esecuzione potrebbe essere qualcosa del genere:
- DA
- DOVE
- GRUPPO PER
- SELEZIONA
- AVERE
- ORDINA PER
Le clausole GROUP BY e WHERE potrebbero essere scambiate senza modificare il risultato, così come le clausole HAVING e ORDER BY.
In realtà le cose sono più complesse perché il database può riordinare l'esecuzione secondo diversi piani di esecuzione. Finché il risultato rimane lo stesso, non importa in quale ordine viene eseguito.
Si noti inoltre che se si sceglie un indice per la clausola ORDER BY le righe potrebbero essere già nell'ordine corretto quando vengono lette dal disco. In questo caso la clausola ORDER BY non viene eseguita affatto.