I've prepared this example for you.
ddl + query -->
create table student
(id number,
name varchar2(100));
create table room
(id number,
name varchar2(100));
create table contract
(student_id number,
room_id number);
create table number_seats
(room_id number,
number_seats number);
insert into student values(1, 'Jon');
insert into student values(2, 'George');
insert into student values(3, 'Ian');
insert into student values(4, 'Alex');
insert into student values(5, 'Mary');
insert into room values(1, 'room1');
insert into room values(2, 'room2');
insert into room values(3, 'room3');
insert into room values(4, 'room4');
insert into room values(5, 'room5');
insert into number_seats values(1, 1);
insert into number_seats values(2, 2);
insert into number_seats values(3, 3);
insert into number_seats values(4, 2);
insert into number_seats values(5, 1);
insert into contract values(1, 1);
insert into contract values(2, 2);
insert into contract values(3, 3);
insert into contract values(4, 4);
insert into contract values(5, 4);
select * from room;
select * from student;
select * from contract;
select * from number_seats;
select cont.room_id, num_seats.number_seats - count(*)
from student st
join contract cont on st.id=cont.student_id
join room ro on ro.id=cont.room_id
join number_seats num_seats on num_seats.room_id=ro.id
group by cont.room_id, num_seats.number_seats
union
select ro.id, num_seats.number_seats
from room ro left join contract co on ro.id=co.room_id
join number_seats num_seats on num_seats.room_id=ro.id
where co.room_id is null
order by 1;
Result is
|roomNumber|freeSeats|
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 0 |
| 5 | 1 |