Escribes SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY, en ese orden en el papel.
Así se lee y se escribe una consulta, de arriba hacia abajo
El motor procesa FROM, luego WHERE, luego GROUP BY, luego HAVING, luego SELECT, y al final ORDER BY
Un alias se crea en el paso de SELECT, que se ejecuta DESPUÉS de WHERE: WHERE todavía no lo conoce
El orden de ejecución explica varias reglas que parecían arbitrarias
Por qué WHERE no puede usar COUNT(*), por qué HAVING sí puede, por qué un alias de SELECT no funciona en WHERE: todo viene del mismo orden real de ejecución.