Short answer:
Cause its the easiest way to work with tables from subquery
Long answer:
But we can fantasize and imagine how it would be possible to optimize the syntax of SQL queries. I also think about this. Dont know exactly, but it seems like...
if you have query, that return subquery with columns that different from what you have in higher level, seems there no need to have an alias
select id, column1 from t1 left join ( ...some query... ) t2_alias using(id)
seems that t2_alias no need
But! Expect, you have to define not equals operation (not operator using), but something like this:
select id, column1 from t1 left join ( ...some query... ) t2_alias on t1.id > t2_alias.id
In this case you need to define each id with its table (to know what table id must be bigger than another)
So, if we take Postgres, for example, they could do an optimisation: not to require alias if join have equals operator. But it seems like too excessive to make such an optimization for just 1 operator. What about other 1000... cases?
So, its easy to leave contract that alias is always required in subquery.
FROMclause have an alias.