Você está na página 1de 3

Exame de época normal de Base de Dados

Universidade do Algarve, 03/Jan/2017


(duração: 2 horas)

Leia o enunciado com atenção antes de começar o exame. Não pode chamar o docente para lhe
ajudar a compreender o enunciado. A interpretação do texto faz parte do prova. A cotação de cada
pergunta aparece entre parêntesis. Boa sorte!

(2+3+3 = 8v.) Pergunta 1.

O Tó Tabelas foi contratado pelos CTT para fazer uma base de dados para manipular tudo
o que tenha a ver com ruas, códigos postais, freguesias, concelhos e distritos.
Um distrito tem vários concelhos e um concelho pertence apenas a um distrito. Um concelho
tem várias freguesias e uma freguesia pertence apenas a um concelho. Numa dada freguesia
pode haver vários códigos postais, mas um código postal diz respeito apenas a uma freguesia.
Finalmente, pode haver várias ruas que tenham o mesmo código postal. Pode também haver
ruas com o mesmo nome desde que tenham códigos postais diferentes.
O Tó Tabelas prescindiu de fazer um modelo UML para a construção da base de dados e
resolveu criar as tabelas directamente em SQL. Eis o resultado:

CREATE TABLE distritos ( codigo INTEGER PRIMARY KEY,


nome VARCHAR(80));

CREATE TABLE concelhos ( codigo INTEGER PRIMARY KEY,


nome VARCHAR(80));

CREATE TABLE freguesias ( codigo INTEGER PRIMARY KEY,


nome VARCHAR(80));

CREATE TABLE codigosPostais ( codigo CHAR(10) PRIMARY KEY );

CREATE TABLE ruas ( nome VACHAR(100),


codPostal CHAR(10),
codFreguesia INTEGER,
codConcelho INTEGER,
codDistrito INTEGER,
PRIMARY KEY( nome, codPostal ));

1
(a) O Tó Tabelas esqueceu-se de especificar chaves estrangeiras na definição das tabelas em
SQL. Ajude-o a colmatar essa falha, alterando a definição das tabelas.

(b) Baseado no conhecimento que tem deste problema, poderá dizer se a relação ruas estará
na 3a Forma Normal? Justifique.

(c) Esqueça a solução proposta pelo Tó Tabelas e faça um diagrama UML para modelar o
problema.

(2v.) Pergunta 2.

Considere duas relações com o mesmo esquema: R(A, B) e S(A, B). A única chave de R é
{A} e a única chave de S também é {A}. Seja T uma relação obtida através da união (união
de conjuntos, não de sacos) de R com S, ou seja, T = R ∪ S. Poderá inferir que a chave de
T é também {A}? Justifique.

(2v.) Pergunta 3.

Considere uma tabela T declarada em SQL do seguinte modo:

CREATE TABLE T ( nome VARCHAR(50) PRIMARY KEY,


salário INTEGER CHECK( salário <= 4000 )
);

Suponha que num dado instante, T tem os seguintes tuplos:

nome salário
António 1000
José 2000
Susana 3000

e que seguidamente executamos a seguinte sequência de comandos SQL.

INSERT INTO T VALUES (’Maria’, 1200);


UPDATE T SET salário=5000 WHERE nome=’Susana’;
INSERT INTO T VALUES (’António’, 1300);
DELETE FROM T WHERE nome=’José’;

Note que alguns dos comandos podem ser rejeitados pelo SGBD. Indique o conteúdo da tabela
T após o final desta sequência de comandos.

2
(3+3+2 = 8v.) Pergunta 4.

Considere as relações Alunos e Prefs. A relação Alunos contém o número de aluno, nome
completo, curso, e o ano em que o aluno entrou para o curso. A relação Prefs indica as
preferências dos alunos, ano após ano, relativamente ao seu desporto favorito. (A relação
Prefs apenas é actualizada ao final de cada ano, em Dezembro, com a inserção de novos
tuplos correspondentes ao ano corrente.) A chave de Alunos é {numero}. A chave de Prefs
é {numAluno,ano}. Exemplo de possı́veis instâncias:

Alunos:
numero nome curso anoEntrada
57777 José Brincas LEI 2014
58888 Maria Silva LEI 2014
62222 Pedro Santos BQ 2015

Prefs:
numAluno ano desporto
57777 2014 Surf
57777 2015 Surf
57777 2016 Tenis
58888 2014 Judo
58888 2015 Judo
62222 2015 Basket
62222 2016 Basket

(a) Crie uma view em SQL com o nome AlunosPref que faça um join entre as relações Alunos
e Prefs. A view deve ainda criar um atributo adicional denominado anoCurso, o qual
servirá para indicar o ano em que um aluno anda. Repare que isso pode ser calculado
com base no ano de entrada. Por exemplo, em 2014 o José Brincas é do 1o ano, em 2015
é do 2o ano, e em 2016 é do 3o ano).

(b) Escreva uma instrução (ou conjunto de instruções) em SQL que permita responder à
seguinte pergunta: “Qual o desporto favorito dos alunos do 2o ano?”

(c) Especifique em português corrente o significado da seguinte query SQL. (Português cor-
rente não envolve qualquer tipo de linguagem técnica. Quando mais clara e sucinta for
a resposta, melhor cotação terá.)
SELECT nome
FROM Alunos
WHERE numero IN (
SELECT numAluno
FROM Prefs
GROUP BY numAluno
HAVING COUNT(DISTINCT desporto) = 1
);

Você também pode gostar