Essa condição do gabarito me parece errada para apresentar as informações pedidas no exercício:
...Ou mesmo exists, invertendo a condição:
select a.nome from aluno a where exists ( select m.id from matricula m where m.aluno_id = a.id and m.data );
pois se eu quero, segundo o enunciado, todos aqueles que não foram matriculados no intervalo de 45 dias atrás, essa condição simplesmente vai me apresentar 4 alunos, que são justamente aqueles que não foram matriculados no período de 45 dias atrás.
Porém existe um quinto aluno, o Paulo da Silva, que não está matriculado em nenhum curso, logo ao rodar a condição exists, ele não me apresenta esse aluno pois a m.id nunca terá um valor pra ele já que ele não tem numero de matricula válido. Entretanto, ele também é um aluno da tabela alunos e ele também não foi matriculado em nenhum curso nos últimos 45 dias.
Justamente quando você roda o código do gabarito usando o NOT exists, ele retorna os 5 alunos, incluindo o Paulo da Silva, e quando você roda a inversão, ele retorna os 4. Isso acontece justamente porquê o quinto aluno não está matriculado e não aparece com o exists usando a condição de comparação de matricula com a id de aluno.
faça o teste (código do gabarito utilizando o not exists):
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 45 day);
A condição que funcionou pra mim e que pode ser invertida com o exists, tira do código a parte da comparação entre m.aluno_id com a a.id, dessa forma, ele me mostrará todos os alunos que não foram matriculados no período de 45 dias apenas pela condição da DATA na tabela de matrícula.. que no caso do Paulo da Silva é de qualquer forma menor que 45 dias atrás, já que ele não está matriculado.
assim, usando o exists:
select a.nome from aluno a where exists ( select m.id from matricula m where data < now() - interval 45 day);
ou seja, me mostre o nome dos alunos quando esta condição me retornar valor: me mostre o id da tabela de matricula em que as datas sejam ANTERIORES a 45 dias atrás.
e assim invertendo com o not exists:
select a.nome from aluno a where NOT exists ( select m.id from matricula m where data > now() - interval 45 day);
me mostre o nome dos alunos em que a data de matrícula não seja POSTERIOR a data de hoje menos 45 dias atrás.
Ambas deram certo e retornaram os nomes dos mesmos alunos.
Me ajudem companheiros, estou viajando? Rodem as buscas ai e vejam se quando vcs utilizam o código do gabarito não fica faltando justamente um aluno que também não foi matriculado posteriormente a data de 45 dias atrás.