A lista de seleção nem sempre pode ser avaliada por último, pois o ORDER BY pode usar aliases que são definidos na lista de seleção, portanto, devem ser executados posteriormente. Por exemplo:
SELECT foo+bar foobar FROM table1 ORDER BY foobar
Eu diria que em geral a ordem de execução poderia ser algo assim:
- DE
- ONDE
- GRUPO POR
- SELECIONAR
- TER
- ORENDER POR
As cláusulas GROUP BY e WHERE podem ser trocadas sem alterar o resultado, assim como HAVING e ORDER BY.
Na realidade, as coisas são mais complexas porque o banco de dados pode reordenar a execução de acordo com diferentes planos de execução. Contanto que o resultado permaneça o mesmo, não importa em que ordem ele é executado.
Observe também que, se um índice for escolhido para a cláusula ORDER BY, as linhas já poderão estar na ordem correta quando forem lidas do disco. Neste caso, a cláusula ORDER BY não é realmente executada.