2. Considere a seguinte base de dados, usada por um banco de dados de um software de gerncia de clnicas mdicas. /* tabela de clnicas mdicas */ Clinica(CodCli,NomeCli,LocalCli) /* tabela de mdicos */ Medico(CodMed,NomeMed,CodEspeci) CodEspeci referencia Especialidade /* tabela que relaciona mdicos a clnicas */ ClinicaMedico(CodCli,CodMed) CodCli referencia Clinica, CodMed referencia Medico /* tabela coma agenda das consultas dos mdicos */ AgendaConsulta(CodCodCli,CodMed,Data,Hora) (CodCli,CodMed) referencia ClinicaMedico /* tabela com as especialidades que os mdicos podem ter - para cada especialidade, pode ser indicada uma especialidade mais genrica (por exemplo cirurgia geral pode ser uma especialidade mais genrica que cirurgia peditrica); isto indicado pela coluna CodEspeciGenerica*/ Especialidade(CodEspeci,Nome,CodEspeciGenerica) CodEspeciGenerica referencia Especialidade
Sobre esta base de dados, resolver as consultas que seguem usando lgebra relacional: 2.a (Peso 2) Obter o nome das clnicas que tem mdicos que atuam na especialidade denominada Geriatria. i. Resolver sem usar os operadores explcitos de juno. Soluo: NomeCli ( Clinica.CodCli=ClinicaMedico.CodCli AND ClinicaMedico.CodMed=Medico.CodMed AND Medico.CodEspeci=Especialidade.CodEspeci AND Especialidade.Nome=Geriatria (Clinica ClinicaMedico Medico Especialidade ) ) ii. Resolver usando operadores explcitos de juno. Preferir o uso de juno natural, seno, usar equi-juno e em ltimo caso usar theta-juno. Soluo: Como as junes so por colunas homnimas, d para usar a juno natural. NomeCli ( Especialidade.Nome=Geriatria (((Clinica ClinicaMedico ) Medico ) Especialidade ) )
2.b (Peso 1,2) Obter os cdigos dos mdicos que atuam em todas clnicas cadastradas no banco de dados. Soluo: ( CodCli,CodMed (ClinicaMedico) ) ( CodCli (Clinica) ) 2.c (Peso 1,2) Obter os cdigos e nomes dos mdicos que esto livres no dia 28/04/2009. Estar livre na data signica que, para aquele mdico, no h consulta na agenda nesta data. Soluo: ( CodMed, NomeMed (Medico) ) ( CodMed, NomeMed ( Data=28/04/2009 (Medico AgendaConsulta ) ) )
2.d (Peso 1,2. . . ) Obter uma tabela contendo as seguintes colunas: i. Cdigo e nome de cada clnica; ii. Nome de cada mdico da clnica, que atua na especialidade denominada Obstetrcia. Caso a clnica no tiver mdicos ou, caso ela no tiver nenhum mdico atuando nesta especialidade, o cdigo e o nome da clnica devem aparecer seguidos de vazio. Soluo: ( CodCli, NomeCli, NomeMed (Clinica (ClinicaMedico (Medico (Especialidade.CodEspeci=MedicoCodEspeci AND Especialidade.Nome=Obstetrcia ) Especialidade ) ) ) Observar que a seleo por nome de especialidade no pode ser realizada depois da juno externa, pois desfaz o efeito desta. Observar que, caso a ordem das junes for diferente, pode ser necessrio fazer duas junes naturais: ( CodCli, NomeCli, NomeMed (( (Clinica ClinicaMedio ) Medico ) - (Especialidade.CodEspeci=MedicoCodEspeci AND Especialidade.Nome=Obstetrcia ) Especialidade ) )
2.e (Peso 1,2. . . ) Para cada mdico que atua em duas clnicas diferentes, obter o nome do mdico seguido do nome das clnicas. Se um mdico atua em mais de duas clnicas, todos os pares formados por essas clnicas devem aparecer no resultado. Soluo: ( Medico.NomeMed, Clinica1.NomeCli, Clinica2.NomeCli ( Medico.CodMed=ClinicaMedico1.CodMed AND Medico.CodMed=ClinicaMedico2.CodMed AND ClinicaMedico1.CodCli<>ClinicaMedico2.CodCli AND ClinicaMedico1.CodCli=Clinica1.CodCli AND ClinicaMedico2.CodCli=Clinica2.CodCli AND (Medico ( ClinicaMedico1 (ClinicaMedico)) ( ClinicaMedico2 (ClinicaMedico)) ( Clinica1 (Clinica)) ( Clinica2 (Clinica)) )
3. (Peso 1,2. . . ) Considere a seguinte consulta em SQL: SELECT Medico.NomeMed FROM Medico, ClinicaMedico, Clinica WHERE Medico.CodMed = ClinicaMedico.CodMed AND ClinicaMedico.CodCli = Clinica.CodCli AND Medico.CodEspeci = Ortopedia AND Clinica.NomeCli = ABD Ortopedia Mostre a consulta equivalente em lgebra relacional, depois, mostre a representao da consulta em forma de arvore e aps, mostre cada um dos passos da otimizao algbrica. Soluo: Consulta em lgebra relacional (a ordem dos produtos cartesianos foi arbitrada; outras ordens so equivalente e levam a uma consulta diferente com o mesmo resultado): Medico.NomeMed Medico.CodMed = ClinicaMedico.CodMed AND ClinicaMedico.CodCli = Clinica.CodCli AND Medico.CodEspeci = M AND Clinica.NomeCli = ABD Ortopedia ( Medico (ClinicaMedico Clinica ) ) As rvores no esto apresentadas.