この理由は、クエリがどういう順序で評価されているかを考えれば、わかりやすいです。
いきなりWHERE句からクエリを評価しようとして、
WHERE句で指定された列名を確認しても、
FROM句で指定されているテーブル名を知っておかないと、
どのテーブルの列か不明なので、評価できません。
つまり、FROM句を評価した後に、WHERE句の評価をするはずです。
人間がクエリの解釈をするときも同じですよね。
このように考えていくと、SELECTクエリの評価は、
FROM → WHERE → GROUPBY → HAVING → ORDERBY → SELECT句のような順で
評価されるはずです。
そのため、SELECT句より先に評価されるGROUPBY句やHAVING句では、
SELECT句で指定した別名が使えないのです。
たぶん。
個人的に、そういう理解をしました。