The first part of your question about referencing subqueries is completely separate from the second part!
I'll answer them both anyway.
If you don't give an expression an alias, the column name is whatever the expression is. So in your example the column in the outer query is 6*7. Note this is an invalid name, so you have to wrap it in double quotes:
select "6*7" from
( select 6*7 from dual
) ;
6*7
42
When selecting values from a nested table, it depends upon what you're doing.
If it's a table of single values (e.g. table of varcahr2/number/date) then you reference the column with "column_value":
declare
l_abc abc;
l_emp_table emp_table;
begin
select first_name bulk collect
into l_abc
from hr.employees
where department_id=50;
dbms_output.put_line ( l_abc.count ) ;
select emprec(t.column_value, null)
bulk collect
into l_emp_table
from table ( l_abc ) t ;
dbms_output.put_line ( l_emp_table.count ) ;
end;
/
45
45
If you're selecting into a table of objects then you can access the fields of the object as normal:
declare
l_abc emp_table;
l_emp_table emp_table;
begin
select emprec(first_name , job_id)
bulk collect
into l_abc
from hr.employees
where department_id=50;
dbms_output.put_line ( l_abc.count ) ;
select emprec(t.f_name, t.f_job)
bulk collect
into l_emp_table
from table ( l_abc ) t ;
dbms_output.put_line ( l_emp_table.count ) ;
end;
/
45
45