Yep, a few.
1. Temporary views. This one's my favourite but not everything supports it and sometimes DBMSs have weird limitations, not like allowing parameter binding in them.
2. Temporary tables, as you mention
3. CTEs ("with expressions"). These would be my favourite if they weren't an optimisation fence in postgres.
WITH active_users
AS (select * from users where user.login > 0)
select * from active_users where active_users.country is not null;
4. If you're only using it once, a subselect lets you add a name to it if that's all you're after
select *
from (select * from users where user.login > 0) AS active_users
where active_users.country is not null;
5. If you're using active_users frequently and want it to be globally accessible, a regular view. Often you can make a DB much more useable with a few well placed views like this and you'll need a few less abstractions as well.