Universidade Estadual do Ceará Curso: Ciências da Computação Disciplina: Banco de Dados I Professor: Wamberg Oliveira Aluno:____________________________________________________________

2ª Avaliação

1. (5,0 pontos) Dado o modelo abaixo, realize as seguintes consultas SQL

a)Procure todas as companhias (nome) cujo endereço da matriz é idêntico ao endereço de seu presidente.
SELECT C.NOME FROM COMPANHIA C, EMPREGADO E,PESSOA P WHERE C.PRESIDENTE = E.CPF AND E.CPF = P.CPF AND AND C.RUA = P.RUA;

C.LOCACAO=P.LOCACAO

b) Determine o número de companhias cujo salário anual do presidente excede R$200.000,00.
SELECT COUNT(C.CNPJ)

FROM COMPANHIA C, EMPREGADO E WHERE C.PRESIDENTE = E.CPF AND E.SALARIO >= 200000/12;

c) Determine os nomes e salários dos empregados maiores de 30 anos que estão de alguma forma associados a companhia FORD. Obs: Gerente e Presidente também são funcionários.
1

UECE

Banco de Dados 1

Prof. Wamberg

SELECT P.NOME, E.SALARIO FROM EMPREGADO E, EMPS_SUB ES,SUBSIDIARIA S, COMPANHIA C, PESSOA P WHERE S.MATRIZ=C.CNPJ AND S.CNPJ = ES.CNPJ AND P.CPF = E.CPF AND E.CPF=ES.CPF AND P.IDADE >= 30 AND C.NOME ='FORD' UNION SELECT P.NOME, E.SALARIO FROM EMPREGADO E,SUBSIDIARIA S, COMPANHIA C, PESSOA P WHERE S.MATRIZ=C.CNPJ AND P.CPF = E.CPF AND E.CPF=S.GERENTE AND P.IDADE >= 30 AND C.NOME ='FORD' UNION SELECT P.NOME, E.SALARIO FROM EMPREGADO E,COMPANHIA C, PESSOA P WHERE E.CPF = C.PRESIDENTE AND P.CPF = E.CPF AND P.IDADE >= 30 AND C.NOME ='FORD'

(Existem outras formas de fazer) d) Selecione as pessoas acima de 50 anos que não são empregados.
SELECT P.NOME, P.CPF FROM PESSOA P WHERE P.IDADE > 50 AND P.CPF NOT IN (SELECT E.CPF FROM EMPREGADO E);

e) Nomes das companhias que tem todas as subsidiárias na mesma cidade da Matriz.
SELECT C.NOME FROM COMPANHIA C WHERE NOT EXISTS (SELECT * FROM SUBSIDIARIA S WHERE S.MATRIZ= C.CNPJ AND S.LOCACAO<>C.LOCACAO)

Obs: E se a companhia não tivesse nenhuma subsidiária??? Ela sairia no resultado. Como evitar isso? Pensem!!!! f) Para cada subsidiária obtenha a média de salário dos seus empregados. Retorne somente as subsidiárias que possuem mais de 5 funcionários. Obs: Gerente também é um funcionário.
SELECT S.NOME, AVG(E.SALARIO) FROM SUBSIDIARIA S, EMPS_SUB ES, EMPREGADO E WHERE (ES.CNPJ=S.CNPJ AND ES.CPF=E.CPF) OR (E.CPF=S.GERENTE) GROUP BY S.NOME; HAVING COUNT(*) >5

2

UECE

Banco de Dados 1

Prof. Wamberg

g) Verifique se o empregado chamado “Roberto Cabral” trabalha na subsidiária “SFORD” da companhia FORD.
SELECT E.CPF, P.NOME, S.NOME, C.NOME FROM EMPS_SUB ES, SUBSIDIARIA S, COMPANHIA C, EMPREGADO E, PESSOA P WHERE P.NOME='Roberto Cabral' AND S.NOME='SFORD' AND E.CPF=ES.CPF AND C.NOME='FORD' AND S.MATRIZ=C.CNPJ AND ES.CNPJ=S.CNPJ AND P.CPF=E.CPF;

(3,0 pontos) Visões em SQL são tabelas virtuais, i.e., elas não estão armazenadas no banco de dados, mas suas definições são usadas para traduzir consultas nas visões em consultas sobre as tabelas do banco. Uma desvantagem de visões virtuais é que elas têm que ser re-computadas todas as vezes que uma consulta referencia a visão. Um enfoque alternativo é materializar a visão: O conteúdo de uma visão é computado e o resultado é armazenado em uma tabela do banco. Desta forma, uma consulta envolvendo a visão pode acessar diretamente a tabela já materializada. O problema é que quando o conteúdo das tabelas do banco que são usadas na definição da visão muda, então o conteúdo da visão materializada também tem que mudar para refletir estas mudanças.
2.

Considere as tabelas: EMPREGADOS (CPF, nome, salário, codDepto). DEPARTAMENTOS (codigo, nome, telefone, CPF_gerente) Uma visão materializada contendo os empregados do departamento de Vendas pode ser criada como se segue: 1. CREATE TABLE EMPREGADOS_VENDAS (CPF:Integer, nome:string, salário:real, telefone:string). 2. Inicialmente, V é povoada usando o seguinte comando SQL: INSERT INTO V
SELECT e.CPF, e.nome, e.salario, d.telefone

FROM EMPREGADOS e, DEPARTAMENTOS d WHERE d.código = e.código and d.nome =”vendas” Agora a visão/ relação EMPREGADOS_VENDAS pode ser consultada diretamente. Se uma inserção ocorre na tabela EMPREGADOS, então EMPREGADOS_VENDAS precisa ser atualizada para refletir estas mudanças. Para mantermos a consistência de V com R podemos usar um trigger: (a) Escreva um trigger para manter a consistência de EMPREGADOS_VENDAS para refletir uma inserção em EMPREGADOS.
CREATE TRIGGER Ins_Empregados AFTER INSERT ON EMPREGADOS AS WHEN :NEW.codDepto = (select codigo from DEPARTAMENTOS WHERE nome = ‘vendas’) THEN INSERT INTO EMPREGADOS_VENDAS SELECT :NEW.CPF, :NEW.nome, :NEW.salario, :NEW.telefone 3

UECE

Banco de Dados 1

Prof. Wamberg

FROM :NEW, DEPARTAMENTOS d WHERE d.codigo = :NEW.codDepto

(b) Escreva outro trigger para manter a consistência de EMPREGADOS_VENDAS para refletir um “UPDATE” em DEPARTAMENTOS.
CREATE TRIGGER Upd_Departamentos AFTER UPDATE ON DEPARTAMENTOS AS WHEN (:NEW.nome = ‘vendas’) and (:OLD.telefone <> :NEW.telefone) THEN UPDATE EMPREGADOS_VENDAS ev SET ev.telefone = :NEW.telefone

(c) Identifique outros triggers necessários para a manutenção da consistência de EMPREGADOS_VENDAS.
UPDATE na tabela EMPREGADOS e DELETE na tabela EMPREGADOS.

4

Sign up to vote on this title
UsefulNot useful