Oi Pessoal, realizei o exercício com a seguinte query:
select a.nome, avg(n1.nota), avg(n1.nota) - (select avg(n2.nota) from nota n2) from nota n1 join resposta r on r.id=n1.resposta_id join aluno a on a.id=r.aluno_id join matricula m on m.aluno_id=a.id where m.data < now() - interval 3 month group by a.nome;
Foi me retornado o seguinte resultado:
| nome | avg(n1.nota) | avg(n1.nota) - (select avg(n2.nota) from nota n2) |
+-----------------+--------------+---------------------------------------------------+
| João da Silva | 6.2857 | 0.5450 |
| Frederico José | 6.2500 | 0.5093 |
| Alberto Santos | 5.7778 | 0.0370 |
| Renata Alonso | 4.8571 | -0.8836 |
+-----------------+--------------+---------------------------------------------------+
Depois inverti o sinal de "menor" e a query retornou vazia. Vi que o exercício é focado para utilizar uma subuery com o IN. Mas ela é realmente necessária para trazer os dados que precisamos? Pois a opinião do instrutor ele faz um JOIN na tabela de Seção que retorna vazio, como mostra abaixo:
select a.nome, avg(n1.nota) as media, avg(n1.nota) - (select avg(n2.nota) from nota n2) as diferenca from nota n1 join resposta r on r.id = n1.resposta_id join exercicio e on e.id = r.exercicio_id join secao s on s.id = e.secao_id join aluno a on a.id = r.aluno_id where a.id in (select aluno_id from matricula where data > now() - interval 3 month) group by a.nome ;
Para que fazer o JOIN em na tabela de Seção se posso fazer o JOIN direto na tabela de matrícula e evitar esta volta?
Espero ter sido claro.