Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Qual a diferença entre A e B?

Qual a diferença entre A e B? Não deveria dar a mesma resposta?

A

select a.nome, c.nome, avg(n.nota) from nota n join resposta r on r.id = n.resposta_id join aluno a on a.id = r.aluno_id join matricula m on m.aluno_id = a.id join curso c on c.id = m.curso_id group by c.nome, a.nome;

B

select a.nome, c.nome, avg(n.nota) from nota n join resposta r on r.id = n.resposta_id join exercicio e on e.id = r.exercicio_id join secao s on s.id = e.secao_id join curso c on c.id = s.curso_id join aluno a on a.id = r.aluno_id group by c.nome, a.nome;

3 respostas
solução!

Boa tarde Bruno!

No meu caso está um pouco diferente pois fiz o curso de MySQL, mas o princípio é o mesmo.

A diferença entre as 2 queries é que a query A faz um join na tabela de matriculas, enquanto a query B não faz.

Um aluno pode estar matriculado em mais de um curso.

Se você executar a query A terá um resultado:

MariaDB [sql2]> select a.nome, c.nome, avg(n.nota) from nota n
    -> join resposta r on r.id = n.resposta_id
    -> join aluno a on a.id = r.aluno_id
    -> join matricula m on m.aluno_id = a.id
    -> join curso c on c.id = m.curso_id
    -> group by c.nome, a.nome;
+----------------+---------------------------------+-------------+
| nome           | nome                            | avg(n.nota) |
+----------------+---------------------------------+-------------+
| Frederico José | Desenvolvimento web com VRaptor |      6.2500 |
| Renata Alonso  | PHP e MySql                     |      4.8571 |
| Alberto Santos | Scrum e métodos ágeis           |      5.7778 |
| Frederico José | SQL e banco de dados            |      6.2500 |
| João da Silva  | SQL e banco de dados            |      6.2857 |
+----------------+---------------------------------+-------------+
5 rows in set (0.06 sec)

Se executar a query B terá outro resultado:

MariaDB [sql2]> select a.nome, c.nome, avg(n.nota) from nota n
    -> join resposta r on r.id = n.resposta_id
    -> join exercicio e on e.id = r.exercicio_id
    -> join secao s on s.id = e.secao_id
    -> join curso c on c.id = s.curso_id
    -> join aluno a on a.id = r.aluno_id
    -> group by c.nome, a.nome;
+----------------+-----------------------+-------------+
| nome           | nome                  | avg(n.nota) |
+----------------+-----------------------+-------------+
| Renata Alonso  | PHP e MySql           |      4.8571 |
| Alberto Santos | Scrum e métodos ágeis |      5.7778 |
| Frederico José | SQL e banco de dados  |      6.2500 |
| João da Silva  | SQL e banco de dados  |      6.2857 |
+----------------+-----------------------+-------------+
4 rows in set (0.00 sec)

MariaDB [sql2]>

Repare que o aluno Frederico José aparece 2 vezes na query A, mas não na query B.

Quando você faz um join na tabela de matriculas, você traz 2 registros para esse aluno, já que ele está matriculado em 2 cursos.

Ok, obrigado Jonas!

Não há de quê! :-)