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

Consultas na resposta da aula 6

Olá!

Fiquei com uma duvida sobre a resolução do ultimo exercicio da aula 6 de MySQL II: Consultas poderosas, onde durante a aula no exercício em que precisamos calcular a diferença da média do aluno para a média geral, a solução passada pelo instrutor é a seguinte. 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 group by a.nome Utilizamos uma sub-query com nome diferente da principal para fazer o calculo, porém no ultimo exercicio desta unidade o problema é o seguinte: "Exiba a quantidade de matrículas por curso. Além disso, exiba a divisão entre matrículas naquele curso e matrículas totais." E a solução: select c.nome, count(m.id), count(m.id)/(select count(id) from matricula m) from curso c join matricula m on m.curso_id = c.id group by c.nome

Gostaria de saber porque em um dos exemplos usamos nomes diferentes para fazer as querys e no outro utilizamos apenas um unico? Eu entendi que neste segundo exemplo ele não estaria efetuando a divisão do total de matriculas pelas matriculas de cada curso, mas sim dividindo o total pelo total também, alguém poderia me auxiliar?

5 respostas

Bom dia Felipe!

Sua pergunta é bem interessante.

Eu testei com nomes diferentes (n1 e n2):

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.r
esposta_id join exercicio e on e.id = r.exercicio_id join secao s on s.id = e.se
cao_id join aluno a on a.id = r.aluno_id group by a.nome;
+----------------+--------+-----------+
| nome           | media  | diferenca |
+----------------+--------+-----------+
| Alberto Santos | 5.7778 |    0.0370 |
| Frederico José | 6.2500 |    0.5093 |
| João da Silva  | 6.2857 |    0.5450 |
| Renata Alonso  | 4.8571 |   -0.8836 |
+----------------+--------+-----------+
4 rows in set (0.00 sec)

E com o mesmo nome (n):

MariaDB [sql2]> select a.nome, avg(n.nota) as media, avg(n.nota) - (select avg(n
.nota) from nota n) as diferenca from nota n join resposta r on r.id = n.respost
a_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 group by a.nome;
+----------------+--------+-----------+
| nome           | media  | diferenca |
+----------------+--------+-----------+
| Alberto Santos | 5.7778 |    0.0370 |
| Frederico José | 6.2500 |    0.5093 |
| João da Silva  | 6.2857 |    0.5450 |
| Renata Alonso  | 4.8571 |   -0.8836 |
+----------------+--------+-----------+
4 rows in set (0.00 sec)

E o resultado foi exatamente igual.

Não sei dizer se há casos em que só funcione utilizando aliases ("nomes") diferentes.

Boa noite Jonas,

Também realizei o teste e o resultado foi o mesmo, porém na aula em que essa consulta é montada, o instrutor fala que é necessário utilizar aliases diferentes para cada uma, pois senão o SQL iria se confundir. Daí acabei ficando na dúvida se devem ser usados aliases diferentes ou podemos utilizar sempre o mesmo e irá funcionar igual.

solução!

Neste caso, não é preciso usar ALIASES diferentes. É importante usar ALIASES diferentes quando for necessário fazer junções entre as tabelas por meio de relacionamentos. Nesta caso, n2 não é usada para nada fora do escopo do SELECT onde é criado. Então, pode usar n1 ou não usar apelido algum.

Pode ser escrito assim:

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.r esposta_id
join exercicio e on e.id = r.exercicio_id 
join secao s on s.id = e.se cao_id 
join aluno a on a.id = r.aluno_id 
group by a.nome;

Ou assim:

select 
    a.nome, 
    avg(n1.nota) as media, 
    avg(n1.nota) - (select avg (nota) from nota) as diferenca 
from nota n1 
join resposta r on r.id = n1.r esposta_id
join exercicio e on e.id = r.exercicio_id 
join secao s on s.id = e.se cao_id 
join aluno a on a.id = r.aluno_id 
group by a.nome;

Mas, se fosse necessário realizar outra operação relacionando a tabela NOTA consigo mesma então teríamos que usar dois ALIASES diferentes.

Entendi, então preciso usar dois aliases diferentes apenas quando eu realizar uma operação entre a própria tabela. Obrigado pela solução.

Show de bola Gabriel! Obrigado pelo esclarecimento! :-)