В первом запросе ниже предполагается, что в student_has_teacher могут быть повторяющиеся записи, и вы избежите дублирования результатов, даже если это так:
select s.id, s.name
from student s
where s.id in (
select sht.student_id
from student_has_teacher sht
inner join teacher on sht.teacher_id = t.id
where t.name = 'John'
)
Если в student_has_teacher нет дубликатов, вы можете использовать объединения, например:
select s.id, s.name
from student s
inner join student_has_teacher sht on s.id = sht.student_id
inner join teacher on sht.teacher_id = t.id
where t.name = 'John'