revista

8
FAMINAS Faculdade de Minas Lista de Exercícios Banco de Dados II Professor Virgílio Borges Aluno: Guilherme dos Santos Alves Período: 4º

Upload: guilherme-alves

Post on 23-Mar-2016

216 views

Category:

Documents


0 download

DESCRIPTION

é uma revista bacana

TRANSCRIPT

Page 1: REVISTA

FAMINAS Faculdade de Minas

Lista de Exercícios

Banco de Dados II

Professor Virgílio Borges

Aluno: Guilherme dos Santos Alves

Período: 4º

Page 2: REVISTA

1.1. Criar uma visão que mostre o nome e o código dos funcionários do sexo masculino que ganham entre R$ 500,00 e R$ 1500,00. create view funcionarios_homens (codigo, nome, salario)as select codfun, nomfun, salfun from funcionario where sexfun='M'; select *from funcionarios_homens where salario > '500' and salario < '1500'; 1.2. Criar uma visão que mostre o nome dos clientes que fizeram compras no ano de 2006 (sem repetição). select distinct c.nomcli // atribuindo um apelido a tabela cliente de c ***Obs: Distinct é para não haver repetição form cliente c // atribuindo um apelido a tabela cliente de c join venda v // atribuindo um apelido a tabela venda de v on c.codcli= v.codcli // onde codigo do cliente da tabela c é igual codigo cliente tabela venda where to-char(v.datven, "yyyy')='2006'; //Quando ano yyyy, mes mm dia dd 1.3. Criar uma visão que mostre o nome e o preço dos produtos vendidos pelo funcionário "X" (sem repetição). create view Funionario_X(Produto, Preço) as select p.nompro, p.prepro from produto p inner join item_venda iv on p.codpro = iv.codpro inner join venda v on v.codven = iv.codven inner join funcionario f on f.codfun = v.codfun where f.nomfun like 'X'; 2.1. Listar o código do funcionário e a quantidade de vendas realizadas por ele. Select codfron, count (*) as quant from vendas group by codfun; 2.2. Listar o código da venda e a quantidade total de produtos vendidos em cada venda. select venda.codven, count(item_venda.codven) from venda inner join item_venda on venda.codven = item_venda.codven group by venda.codven; 2.3. Listar a quantidade de funcionários de cada departamento. select coddep, count(*) as quantidade from funcionario group by coddep;

Page 3: REVISTA

2.4. Listar o nome do funcionário e a quantidade de vendas realizadas por ele, somente se o funcionário efetuou mais de 2 vendas. select f.nomfun, count(*) as quantidade from funcionario f join venda v on f.codfun= v.codfun group by f.nomfun having count(*) >0; 2.5. Listar o nome e a quantidade total de itens comprados por cada cliente. select c.nomcli, sum(iv.qtdite) as quant_itens from cliente c left join venda v on c.codcli = v.codcli inner join item_venda iv on v.codven = iv.codven group by c.nomcli; 2.6. Listar a data da venda e a quantidade vendida naquele dia (para todos os dias registrados). select v.datven, sum(iv.qtdite) from venda v inner join item_venda iv on v.codven = iv.codven group by v.datven; 2.7. Listar o nome do funcionário e a quantidade de clientes distintos que ele já atendeu. 3.1. Listar o nome do produto mais caro. Select nompro from produto where prepro >= all (select prepro from produto); 3.2. Listar o nome e o estoque do(s) produto(s) com maior estoque. select nompro, estpro from produto where estpro >= all(select estpro from produto); 3.3. Listar o nome dos funcionários que ganham mais que todos os funcionários do sexo feminino. select nomfun from funcionario where salfun > all(select salfun from funcionario where sexfun = 'F'); 3.4. Listar o nome dos funcionários que ganham menos que todos os funcionários do departamento 2 e são mulheres. select nomfun from funcionario where sexfun = 'F' and salfun < all(select salfun from funcionario where coddep = 2)

Page 4: REVISTA

3.5. Listar o nome dos produtos que nunca foram vendidos. Select nompro from produto where codpro <> all (seletc codpro from item_venda); 3.6. Listar o nome dos clientes que já efetuaram alguma compra (sem repetição). Select nomcli from cliente Where codcli= any (select codcli from venda); 4.1. Listar o nome dos produtos que nunca foram vendidos. Select nompro from produto where codpro <> all (seletc codpro from item_venda); 4.2. Listar o nome dos clientes que já efetuaram alguma compra (sem repetição). select nomcli from cliente where codcli in (select codcli from venda); select nomcli from cliente where exists(select c.nomcli from cliente c inner join venda v on c.codcli = v.codcli); 4.3. Listar o nome dos funcionários que não venderam em 2005. Select nomfun from funcionario Where codfun not in (seletc codfun from venda where tochar (codven, “yyyy”)= 2005); 4.4. Listar os funcionários do departamento 1 que não efetuaram vendas em 2006. select f.nomfun from funcionario f where not exists(select codfun from venda where venda.codfun = f.codfun and extract(year from datven) = '2006') and coddep=1; 5.1. Listar o nome do funcionário e a data da venda para todas as vendas registradas em ordem decrescente de data. Select nomfun, v. datven From funcionário f Join venda v on f. codfun = v.codfun order by v.datven desc; 5.2. Listar o nome do cliente, o nome do funcionário e a data da venda para todas as vendas registradas. select c.nomcli, f.nomfun, v.datven from cliente c inner join venda v on c.codcli = v.codcli inner join funcionario f

Page 5: REVISTA

on f.codfun = v.codfun; 5.3. Listar o nome do produto e a quantidade de itens vendidos na venda de código 2 em ordem alfabética de nome do produto. select p.nompro, sum(iv.qtdite) from produto p inner join item_venda iv on p.codpro = iv.codpro inner join venda v on v.codven = iv.codven where v.codven = 2 group by p.nompro order by p.nompro; 5.4. Listar o nome dos produtos que nunca foram vendidos. Seletc p.nompro From produto p Left . join Item_venda i on p. codpro=i.codpro Where i.codpro is null; 5.5. Listar o nome dos funcionários que não venderam em 2005. Select nomfun from funcionario Where codfun not in (seletc codfun from venda where tochar (codven, “yyyy”)= 2005); 6.1. Adicione o atributo PREMEDPRO (preço médio) na tabela PRODUTO. Crie um gatilho que atualize o preço médio de um produto automaticamente, sempre que houver alterações no preço de venda do mesmo. Quando o produto é cadastrado pela primeira vez, seu preço médio é igual ao seu preço de venda. A partir daí, qualquer alteração no preço de venda deve alterar também o preço médio, da seguinte forma: novo preço médio = (preço médio + preço) / 2. create or replace trigger Atualiza_preco_medio before update of prepro on produto for each row begin update produto set premedpro =( premedpro + :new.prepro) / 2; end; 6.2. Crie uma tabela de histórico para registrar as mudanças de salário de cada funcionário. Sempre que houver alteração no salário esta deve ser registrada na tabela de histórico, tal como no exemplo a seguir: "O funcionário XXXXXXXXXXXXX teve aumento de salário no dia 99/99/9999 de R$ 999.99 para R$ 999.99.". Se for redução salarial, a mensagem deverá ser modificada para "redução". Create or replace trigger After update on funcionário For each row Begin If : new.salfun>;dd.salfun then

Page 6: REVISTA

Insert into historic values ( ‘O funcionario ‘ || new.nomfunc || teve aumento de salario no dia de’ ||: dd.salfun ||’para’|| :new.salfun); Else insert ( into histórico values (‘O funcionario’ || new.nomfunc|| teve redução de salário no dia de’||:dd.salfun||’para’||: new.salfun); end if; end. 6.3. Adicione o atributo ESTMINPRO (estoque mínimo) na tabela PRODUTO. Crie um gatilho que registre na tabela de histórico sempre que o estoque de um produto estiver abaixo do estoque mínimo. A mensagem deverá ser no formato: "O produto XXXXXXXXXX está com estoque abaixo do limite mínimo de 999 unidade(s).". CREATE OR REPLACE TRIGGER AFTER UPDATE ON PRODUTO

FOR EACH ROW BEGIN

IF NEW.ESTMINPRO < DD.ESTPRO INSERT INTO HISTORICO VALUES ( ‘O PRODUTO ‘ || DD.CODPRO || ESTA COM ESTOQUE BAIXO DO LIMITE MINIMO DE 999 UNIDADES);

END IF; END.

6.4. Crie um gatilho que registre na tabela de histórico sempre que um novo cliente for cadastrado. A mensagem deverá ser no formato: "O cliente XXXXXXXXXX foi cadastrado com sucesso às 99:99:99 de 99/99/9999.". Utilize a função do Oracle que retorna a data corrente do sistema. 6.5. Crie um gatilho que registre na tabela de histórico sempre que o servidor Oracle for desligado. A mensagem deverá ser no formato: "O servidor foi desligado às 99:99:99 de 99/99/9999.". Utilize o evento do sistema gerado pelo Oracle para criar o gatilho. 7. Mostre o que será gerado como resposta pelas consultas abaixo (desenhe a tabela com a resposta): a) SELECT c.nomcli, f.nomfun FROM funcionario f JOIN venda v ON f.codfun=v.codfun JOIN cliente c ON c.codcli=v.codcli;

NOMCLI NOMFUN

C Y

B Z

A Y

Page 7: REVISTA

b) SELECT c.nomfun, v.codven, v.datven FROM funcionario f

LEFT JOIN venda v ON f.codfun=v.codfun;

NOMFUN CODVEN DATVEN

Y 1 1/2/2007

Z 2 26/11/2006

Y 3 26/11/2006

X NULL NULL

c) SELECT count(*) FROM venda v RIGHT JOIN cliente c ON v.codcli=c.codcli WHERE v.codven IS NULL;

COUNT(*)

0

8. Defina os seguintes termos no contexto de processamento de transações: Atomicidade: Ou todas as operações são executadas ou nenhuma é executada.Componente de gerenciamento de transação. Consistência: A transação deve preservar a consistência do banco de dados. Isolamento: Para o usuário mesmo quando existirem transações concorrentes sua transação deve ser independente das demais.Componente de controle de concorrência. Durabilidade: Significa que se houver erro no processamento da transação ela deberá ser abortada e o banco de dados (SGDB) deve garantir a integridade dos dados ou seja, deve parecer que nada aconteceu.Componente de gerenciamento de recuperação.

9. O padrão SQL define quatro níveis de isolamento de transação em termos de três fenômenos (violações)que devem ser evitados entre transações concorrentes. Escreva um texto explicando estes fenômenos.

dirty read (leitura suja): É possível que uma transacção veja alterações que outra transacção efectuou mas ainda não confirmou.

nonrepeatable read (leitura que não pode ser repetida): Não é garantido que os resultados serão iguais se o mesmo comando for executado entre o início e o fim da transação. Significa

Page 8: REVISTA

que os dados de algumas linhas já vistas anteriormente podem mudar devido a outras transações que se completaram, entretanto.

phantom read (leitura fantasma): É possível que outra transacção acrescente linhas à tabela e que essas novas linhas – ditas fantasma – sejam vistas quando o mesmo comando é executado novamente antes do fim da transacção. Significa que os dados de linhas já vistas anteriormente não mudam, mas que podem aparecer novas linhas no resultado.

10. Sejam T1 e T2 transações concorrentes. Responda: a) T1: SET TRANSACTION ISOLATION LEVEL READ COMMITTED; T2: SET TRANSACTION ISOLATION LEVEL READ COMMITTED; T2: SELECT * FROM produto WHERE codpro = 1; T1: UPDATE produto SET nompro = 'PORCA' WHERE codpro = 1; T2: SELECT * FROM produto WHERE codpro = 1; O que será mostrado em cada SELECT de T2? Será mostrado PREGO nos DOIS selects. A resposta seria diferente se T1 executasse um COMMIT logo após o comando UPDATE? Justifique sua resposta. SIM, apareceria PREGO no primeiro e PORCA no segundo select. Justificativa: No nível de isolamento "Read Commited" pode acontecer o fenômeno "Leitura não pode ser repetida", isto é,uma transação executa o mesmo select duas vezes e obtém dados diferentes.

b) T1: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; T1: SELECT * FROM funcionario WHERE sexfun = 'F'; T2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; T2: INSERT INTO funcionario VALUES (4, 'D', 'F', 456.20); T2: COMMIT; T1: SELECT * FROM funcionario WHERE sexfun = 'F'; O que será mostrado em cada SELECT de T1? Justifique sua resposta. Será mostra apenas o funcionário Y nos DOIS selects.

Justificativa: O nível Serializable fornece o isolamento de transação mais rigoroso. Este nível emula a execução serial das transações, como se todas as transações fossem executadas uma após a outra, em série, em vez de

simultaneamente. Neste nível não ocorre o fenômeno de "Leitura fantasma".