revisao da p2

revisao da p2

por Beatriz Albiero -
Número de respostas: 3

Eu queria algumas dicas para resolver os itens D,E e L do primeiro exercicio da revisao triste

Em resposta à Beatriz Albiero

Re: revisao da p2

por Kelly Rosa Braghetto -

Oi, Beatriz.

Eis as dicas:

d) Encontre os nomes de todos os alunos que estão matriculados em dois cursos que são ministrados no mesmo horário.

Para facilitar, você pode começar pensando que está interessada somente nos números dos alunos. Assim, para responder essa consulta (mais fácil) você precisa somente de informações que estão nas tabelas Matriculado e Curso. Fazendo uma junção natural dessas duas tabelas, você consegue saber os horários de todos os cursos de todas as matrículas, certo? Então, eu vou chamar de MC o resultado dessa junção natural. Agora, vou podemos fazer uma autojunção de MC para resolver a consulta. Seria algo como:

select MC1.nroAluno from MC as MC1, MC as MC2 where MC1.nroAluno = MC2.nroAluno and MC1.horario = MC2.horario and MC1.nomeCurso <> MC2.nomeCurso   (ou seja, estou procurando dois registros de matrícula que sejam de um mesmo aluno, sejam para o mesmo horário, mas tenham cursos diferentes).

Bom, agora você precisa juntar essas dicas em uma só consulta, ok?

------------------------------

d) Encontre os nomes dos professores que ministram cursos em todas as salas em que algum curso é ministrado.

Esse é caso clássico de uso da operação de divisão da Álgebra Relacional.  Como o mapeamento dela para SQL não é trivial, vou incluir a resposta direto aqui pra você:

select nomeProf  from professor as P where not exists(
(select distinct sala from curso)                      ----> C1: todas as salas onde se ministram cursos
except                                                             ----> operação de diferença de conjuntos
(select distinct sala from curso where idProf = P.idProf)); ---> C2: todas as salas onde um dado professor ministra seus cursos

Para um dado professor, se C1 - C2 é diferente de vazio, então existe uma sala onde se ministra cursos e onde o professor em questão não ministra cursos. Nesse caso, o professor não aparecerá na resposta da consulta.

------------------------------

l) Para cada valor de idade que aparece em Aluno, encontre o valor do nível que aparece com mais frequência. Por exemplo, se houver mais alunos no nível FR com idade 18 do que os alunos com idade 18 nos níveis SR, JR ou SO, você deve imprimir o par (18,FR).

Para responder essa consulta, você precisa obter a frequência de cada possível valor de par (idade, nível). Então, será preciso agrupar as tuplas de Aluno por idade, nivel. Entretanto, um dado valor para o par (idade,nível)  só deve ser incluído na resposta se a contagem de alunos que possuem essa idade e nível for maior que a contagem dos alunos nos demais níveis observados para a mesma idade. A consulta SQL que faz isso é a seguinte:

select idade, nivel from Aluno as A group by idade, nivel
having count(nivel) >= ALL
  (select count(*) from Aluno where idade = A.idade  group by nivel);

 

Suas dúvidas foram esclarecidas?

Até mais,

Kelly

Em resposta à Kelly Rosa Braghetto

Re: revisao da p2

por Beatriz Albiero -

Professora, sobre o item d ainda,

qual é a sintatica para nomear a relação MC e depois fazer uma autojunçao com ela mesma?

Estou quebrando a cabeça...

Exemplo, no slide dos refris temos:

SELECT nome_refri FROM Apreciador, (SELECT nome_cliente FROM Frequentador WHERE nome_lanch = 'Sujinhos') SC WHERE Apreciador.nome_cliente = SC.nome_cliente;

Mas como eu faria uma autojuncao de SC por exemplo? 

Em resposta à Beatriz Albiero

Re: revisao da p2

por Kelly Rosa Braghetto -

Beatriz,

Infelizmente, não dá para "reaproveitar" a MC que você definiu como subconsulta, é preciso criar uma outra subconsulta igual mas com "apelido" diferente.  Por exemplo, nessa consulta dos refris, seria preciso fazer algo como:

SELECT ... FROM (SELECT nome_cliente FROM Frequentador WHERE nome_lanch = 'Sujinhos') SC1, (SELECT nome_cliente FROM Frequentador WHERE nome_lanch = 'Sujinhos') SC2 WHERE SC1.nome_cliente = SC2.nome_cliente AND ...

Ficou mais claro agora?