Prova de Fundamentos de Bancos de Dados 2 a Prova Prof. Carlos A. Heuser Junho de 2006 Prova com consulta duas horas de duração 1 Base de dados para as questões A SBC (Sociedade Brasileira de Computação está montando uma biblioteca digital para armazenar dados sobre a produção de pesquisadores em computação. Uma parte desta base de dados corresponde às tabelas abaixo (esta é a mesma base de dados que foi usada na primeira prova. Pesquisador (CodPesq,NomePesq /* tabela com dados dos pesquisadores que têm produção científica */ Artigo (CodArt,TituloArt,VeiculoArt,AnoArt /* tabela com os dados dos artigos publicados - VeiculoArt é o título do veículo de publicação (nome de um congresso ou de um periódico e AnoArt é o ano de publicação */ Referencia (CodArtReferenciador,CodArtReferenciado /* tabela que contém referências bibliográficas - cada linha contém o artigo que faz a referência e o artigo que é referenciado*/ Autoria(CodArt,CodPesq,PosicaoAut /*tabela que liga um artigo com seus vários pesquisadores autores -- a coluna PosicAut contém a ordem do autor dentro do artigo (1, 2,...*/ 1
2 Questões 1. Sobre esta base de dados, expresse as seguintes consultas em cálculo relacional: a Obter os nomes dos pesquisadores que, em 2006, publicaram artigos em veículo intitulado VLDB Journal, constando como primeiro autor. Pesquisador.NomePesq WHERE Autoria ( Autoria.CodPesq = Pesquisador.CodPesq AND Autoria.PosicaoAut = 1 AND Artigo ( Artigo.CodArt = Autoria.CodArt AND Artigo.AnoArt = 2006 VeiculoArt = VLDB Journal b Obter os nomes dos pesquisadores que não foram autores de artigos. Pesquisador.NomePesq WHERE NOT Autoria ( Pesquisador.CodPesq = Autoria.CodPesq c Obter os códigos dos pesquisadores que publicaram todos artigos de 2006. Pesquisador.CodPesq WHERE Artigo ( Artigo.AnoArt = 2006 IMPL Autoria ( Autoria.CodPesq = Pesquisador.CodPesq AND Autoria.CodArt = Artigo.CodArt 2
2. Expresse as seguintes consultas em SQL, usando sub-consultas: a (idem a questão 1b Obter os nomes dos pesquisadores que não foram autores de artigos. SELECT Pesquisador.NomePesq WHERE NOT EXISTS ( SELECT * WHERE Pesquisador.CodPesq = CodPesq ou SELECT Pesquisador.NomePesq WHERE CodPesq NOT IN ( SELECT CodPesq b (idem a questão1c Obter os códigos dos pesquisadores que publicaram todos artigos de 2006. SELECT Pesquisador.CodPesq WHERE NOT EXISTS ( SELECT * FROM Artigo WHERE Artigo.AnoArt = 2006 AND NOT EXISTS ( SELECT * WHERE Autoria.CodPesq = Pesquisador.CodPesq AND Autoria.CodArt = Artigo.CodArt 3
3. Expresse as seguintes consultas em SQL: a Obter os nomes dos autores que publicaram o maior número de artigos. SELECT NomePesq WHERE CodPesq IN ( SELECT CodPesq GROUP BY CodPesq HAVING COUNT(* = (SELECT MAX(NoArtigos FROM (SELECT CodPesq, COUNT(* AS NoArtigos GROUP BY CodPesq b Para cada veículo que têm mais que três artigos publicados, obter seu título, seguido do número de artigos nele publicados. SELECT VeiculoArt,COUNT(* FROM Artigo GROUP BY VeiculoArt HAVING COUNT(*>3 4
c Para cada autor, obter seu nome seguido do número de diferentes veículos em que ele já publicou. Autores sem publicações também devem aparecer no resultado. SELECT NomeArt, COUNT (DISTINCT VeiculoArt FROM (Pesquisador NATURAL LEFT JOIN Autoria NATURAL LEFT JOIN Artigo GROUP BY Pesquisador.CodArt, NomeArt ou SELECT NomeArt, COUNT (DISTINCT VeiculoArt, Autor, Artigo WHERE Pesquisador.CodPesq=Autoria.CodPesq AND Autoria.CodArt=Artigo.CodArt UNION SELECT NomeArt, 0 WHERE CodPesq NOT IN (SELECT CodPesq 4. Da forma como está especificada, a chave primária da tabela Autoria impede que um mesmo autor apareça mais que uma vez no mesmo artigo. Deseja-se especificar a seguinte restrição de integridade: Em um artigo, uma posição (PosicaoAut não pode ser ocupada mais que uma vez. a Esta restrição de integridade pode ser implementada através de uma restrição de domínio, de obrigatoriedade ou de chave, ou ainda na forma de um CHECK CONSTRAINT? Caso afirmativo, fornecer o comando SQL que a define. Solução: Na tabela, não podem aparecer duas linhas com o mesmo para (CodArt,PosicaoAut. Para impedir isso, basta incluir uma restrição de chave única na tabela: ALTER TABLE Autoria ADD CONSTRAINT PosicaoUnica UNIQUE KEY (CodArt,PosicaoAut 5
b Implementar a restrição através de triggers. Especificar a ação informalmente, indicando a mensagem de erro a ser dada. CREATE TRIGGER PosicaoUnica BEFORE INSERT OR UPDATE ON Autoria REFERENCING NEW AS NewAutoria FOR EACH ROW WHEN ( EXISTS (SELECT * WHERE CodArt=NewAutoria.CodArt AND PosicaoAut=NewAutoria.PosicaoAut ( sinalizar erro Já há autor nesta posição no artigo 6