Tenho a impressão que o professor fez confusão na última pesquisa. Levando em consideração que ele está utilizando "where not exists", a comparação entre "m.data" e " "now() - interval 18 month" deveria ter sido feita com "maior que (>)", ao invés de "menor que (<)". Ou foi eu que fiz confusão?
A intenção dele era encontrar os alunos que não estão matriculados em um curso ou que não se matriculam há 18 meses. A pesquisa inteira do professor foi a seguinte:
select a.nome from aluno a where not exists (
select m.id from matricula m where m.aluno_id = a.id
and m.data < now() - interval 18 month);