Buscar

BD II Lista de exercícios 1 corrigida

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1º lista de exercícios 
Professor: Carlos José Rocha Silva 
Disciplina: Banco de Dados II 
Aula 03: Linguagem de Banco de Dados SQL 
 
Aluno: _________________________________________ Período: _______ 
 
Para melhor compreensão e fixação do conteúdo apresentado nas aulas 01 e 02 e com base no 
seu conhecimento adquirido dos seus estudos. Na situação hipotética (minimundo) apresentada 
abaixo crie o modelo de relacional (DER) e físico do exercício proposto na aula 02 de BD II. 
Sistema de controle de projetos: Você foi contratado para informatizar o controle de projetos de 
uma empresa de médio porte, sua atividade fim é prestação de serviço através de locação de mão 
de obra. Esta empresa fornece serviços engenharia civil, desenvolvimento de software, 
manutenção industrial entre outras. Para isso ela precisa controlar os FUNCIONÁRIOS, em quais 
DEPARTAMENTOS e PROJETOS eles estão alocados. E para cada PROJETO quais são as suas 
ATIVIDADES. Do FUNCIONÁRIO deseja-se saber a Matricula, o Nome, o Sobrenome, 
Departamento, Ramal, Data de Admissão, Número do Cargo, Registro Geral (RG), Sexo Data de 
Nascimento, Salário, Nome da foto. Do PROJETO Código, Nome, Departamento, Responsável, 
Quantidade de equipamentos, Data de início e de fim do projeto. Do DEPARTAMENTO o código, 
o nome, o gerente e se este departamento está sob o controle de outro. Das ATIVIDADES código, 
descrição e sigla. 
 
1. Crie o modelo relacional(DER). 
 
2. Crie um novo Usuário chamado DESENV; 
 
3. Baseado no modelo proposto acima resolva as seguintes questões: 
 
4. Deseja-se uma lista que contenha número da matrícula, primeiro e último nome e cargo de todos 
os funcionários do sexo feminino que tenham cargo superior a 55. 
SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, NR_CARGO 
 FROM FUNCIONARIO 
 WHERE IN_SEXO = 'F' 
 AND NR_CARGO > 55; 
 
5. Deseja-se uma lista que contenha número de matrícula, nome e sobrenome do funcionário em 
cujo sobrenome não seja encontrada a letra “E”. 
SELECT CD_MAT, NM_FUNC, NM_SOBRENOME 
 FROM FUNCIONARIO 
 WHERE NM_SOBRENOME NOT LIKE '%E%'; 
 
6. Obtenha a descrição da tabela FUNCIONARIO. 
describe FUNCIONARIO 
 
A descrição apresenta o nome da coluna no banco de dados (Name), seu tipo e tamanho (Type) e 
a indicação de obrigatoriedade de preenchimento (Null). Sabemos, agora, que quando uma coluna 
não é preenchida, não ocupa espaço na linha que é gravada no banco de dados; por isso, diz que 
seu conteúdo é NULL (desconhecido, ausente). Na tabela FUNCIONARIO, apenas a coluna 
Matrícula deve ser preenchida obrigatoriamente; as demais colunas podem ser informadas ou não 
a tempo de cadastramento. 
 
7. Deseja-se uma lista contendo os códigos de departamento para os departamentos que possuam 
funcionários. Na listagem-resposta, não deve haver repetição de código de departamento. 
SELECT DISTINCT CD_DEPTO 
 FROM FUNCIONARIO 
 WHERE CD_DEPTO IS NOT NULL 
 
No exercício, são selecionados apenas os funcionários que estão alocados a algum departamento, 
ou seja, cujo código do departamento está preenchido. 
 
8. Deseja-se uma lista (matrícula, nome e departamento) de todos os funcionários que estejam 
alocados aos departamentos A00, B01 ou C01. 
SELECT CD_MAT, NM_FUNC, CD_DEPTO 
FROM FUNCIONARIO 
WHERE CD_DEPTO IN ('A00', 'B01', 'C01'); 
 
Faça outros testes usando BETWEEN, substituindo IN por OR e tentando realizar os 
exercícios acima com variáveis de substituição. 
 
9. Inclua todos os funcionários do departamento D11 no departamento D01, acrescentando ao 
número da matrícula o valor 340. 
 
INSERT INTO FUNCIONARIO 
SELECT CD_MAT + 340, NM_FUNC, NM_SOBRENOME, 'D01', NR_RAMAL, DT_ADM, NR_CARGO, 
 NR_RG, IN_SEXO, DT_NASC, VL_SAL, NM_FOTO 
 FROM FUNCIONARIO 
 WHERE CD_DEPTO = 'D11'; 
 
10. Aumente o salário de todos os funcionários em 10%. 
UPDATE FUNCIONARIO SET VL_SAL = VL_SAL * 1.1; 
 
11. Deseja-se excluir todos os departamentos que não possuam funcionários alocados. 
DELETE FROM DEPTO 
 WHERE CD_DEPTO NOT IN (SELECT DISTINCT CD_DEPTO 
 FROM FUNCIONARIO WHERE CD_DEPTO IS NOT NULL); 
 
12. Produza uma lista contendo o cargo, a média salarial e o número de funcionários agrupados por 
cargo para os departamentos D01, D11, D21 e E11. Todos os cargos com menos de três 
funcionários devem ser excluídos do resultado. A lista deve vir ordenada descendentemente por 
média salarial. 
SELECT NR_CARGO, AVG(VL_SAL), COUNT(*) 
 FROM FUNCIONARIO 
WHERE CD_DEPTO IN ('D01', 'D11', 'D21', 'E11') 
GROUP BY NR_CARGO 
HAVING COUNT(*) < 3 
ORDER BY 2 DESC; 
 
13. Deseja-se uma lista contendo o nome do projeto, o nome das atividades e tempo de duração 
de cada atividade (fornecido em número de horas). Ordene o resultado por projeto e atividade. 
Listagem-resposta 2.54A 
SELECT PROJ.NM_PROJ “Projeto”, ATIV.TX_DESCRICAO “Atividade”, 
 TRUNC((PRJATV.DT_FIM - PRJATV.DT_INI) * 24) Horas 
 FROM PROJ, ATIV, PRJATV 
WHERE PRJATV.CD_PROJ = PROJ.CD_PROJ 
AND PRJATV.CD_ATIV = ATIV.CD_ATIV 
ORDER BY PROJ.NM_PROJ, ATIV.TX_DESCRICAO; 
 
 
Listagem-resposta 2.54B 
SELECT PROJ.NM_PROJ “Projeto”, ATIV.TX_DESCRICAO “Atividade”, 
 TRUNC((PRJATV.DT_FIM - PRJATV.DT_INI) * 24) Horas 
 FROM PROJETO_ATIVIDADE PRJATV 
 JOIN 
 ATIVIDADE ATIV ON (ATIV.CD_ATIV = PRJATV.CD_ATIV) 
 JOIN 
 PROJETO PROJ ON(PROJ.CD_PROJ = PRJATV.CD_PROJ) 
ORDER BY PROJ.NM_PROJ, ATIV.TX_DESCRICAO; 
 
A subtração de datas fornece o resultado em número de dias (parte inteira). Multiplicamos por 24 para 
transformar dias para horas e truncamos o resultado para que não fossem apresentados minutos e 
segundos. Observe que neste segundo resultado não usamos a cláusula Where pois não havia qualquer 
restrição específica, apenas as cláusulas relativas ao Join. 
 
14. Deseja-se uma lista contendo o código e nome de cada departamento, nome e sobrenome do 
gerente, ordenado por código de departamento. 
Resposta 255A 
SELECT D.CD_DEPTO, D.NM_DEPTO, F.NM_FUNC, F.NM_SOBRENOME 
 FROM DEPTO D, FUNCIONARIO F 
WHERE D.CD_GERENTE = F.CD_MAT 
 ORDER BY 1; 
 
Resposta B 
SELECT D.CD_DEPTO, D.NM_DEPTO, F.NM_FUNC, F.NM_SOBRENOME 
 FROM DEPTO D 
 JOIN 
 FUNCIONARIO F ON(D.CD_GERENTE = F.CD_MAT) 
 ORDER BY 1; 
 
15. Deseja-se uma lista contendo o nome do projeto, o nome do departamento responsável e o 
nome do funcionário responsável, desde que ele trabalhe no departamento responsável pelo 
projeto. 
SELECT P.NM_PROJ Projeto, D.NM_DEPTO Departamento, F.NM_FUNC Responsavel 
 FROM PROJ P, DEPTO D, FUNC F 
WHERE P.CD_DEPTO = D.CD_DEPTO 
 AND P.CD_DEPTO = F.CD_DEPTO 
 AND P.CD_RESP = F.CD_MAT 
UNION 
SELECT P.NM_PROJ, D.NM_DEPTO, 'Outro Depto' 
 FROM PROJ P, DEPTO D, FUNC F 
WHERE P.CD_DEPTO = D.CD_DEPTO 
 AND P.CD_DEPTO <> F.CD_DEPTO 
 AND P.CD_RESP = F.CD_MAT; 
 
Neste exercício, precisamos realizar uma operação de união, pois no primeiro Select estabelecemos uma 
restrição de tal forma que só seriam apresentados os projetos em que o responsável trabalhasse no 
mesmo departamento. Mas foi solicitado que apenas o nome do funcionário fosse omitido. Por esse 
motivo, unimos o resultado do primeiro Select com o segundo, em que foram selecionados os projetos em 
que o responsável não trabalhava no departamento responsável. Para que este exercício tenha conteúdo, 
devemos alterar uma linha na tabela de projeto para criar a condição adequada. 
 
 
16. Deseja-se saber quais os departamentos que não possuem funcionários (usar Minus). 
SELECT CD_DEPTO, NM_DEPTO 
 FROM DEPTO 
MINUS 
SELECT DEPTO.CD_DEPTO, DEPTO.NM_DEPTO 
 FROM DEPTO, FUNC 
WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO; 
 
17. Deseja-se saber quais os departamentos (código e nome) responsáveis por mais de dois 
projetos e que, simultaneamente, possuam mais de três funcionários (usar Intersect).SELECT D.CD_DEPTO, D.NM_DEPTO 
 FROM PROJ, DEPTO D 
WHERE PROJ.CD_DEPTO = D.CD_DEPTO 
GROUP BY D.CD_DEPTO, D.NM_DEPTO 
HAVING COUNT(*) > 2 
INTERSECT 
SELECT D.CD_DEPTO, D.NM_DEPTO 
 FROM FUNC, DEPTO D 
WHERE FUNC.CD_DEPTO = D.CD_DEPTO 
GROUP BY D.CD_DEPTO, D.NM_DEPTO 
HAVING COUNT(*) > 3; 
 
18. Produza uma lista contendo nome, sobrenome, cargo e salário de todos os funcionários do sexo 
feminino que ganhem mais que todos os funcionários do sexo masculino. 
SELECT NM_FUNC, NM_SOBRENOME, NR_CARGO, VL_SAL 
 FROM FUNCIONARIO 
WHERE IN_SEXO = 'F' 
 AND VL_SAL > (SELECT MAX(VL_SAL) FROM FUNCIONARIO WHERE IN_SEXO = 'M'); 
 
19. Deseja-se obter a média de idade, maior e menor salário e média salarial dos funcionários do 
sexo feminino, grupando por grau de instrução e cargo (somente dos cargos com mais de duas 
funcionárias). 
SELECT NR_CARGO “CARGO”, NR_GIT “GRAU”, 
 AVG(TRUNC((SYSDATE - DT_ADM)/365.25)) “MÉDIA IDADE”, 
 MAX(VL_SAL) “MAIOR SALÁRIO”, 
 MIN(VL_SAL) “MENOR SALÁRIO”, 
 AVG(VL_SAL) “MÉDIA SALARIAL” 
 FROM FUNCIONARIO 
WHERE IN_SEXO = 'F' 
 AND NR_CARGO IN (SELECT NR_CARGO 
FROM FUNCIONARIO 
WHERE IN_SEXO = 'F' 
GROUP BY NR_CARGO 
HAVING COUNT(*) > 2) 
GROUP BY NR_GIT, NR_CARGO; 
 
20. Determine a quantidade de funcionários por departamento separados por sexo. 
SELECT CD_DEPTO “DEPTO”, IN_SEXO “SEXO”, COUNT(*) “QTD” 
 FROM FUNCIONARIO 
GROUP BY CD_DEPTO, IN_SEXO; 
 
 
Sugestão para nome de campos(atributos) e tabelas(entidades): 
Tabela: 
 DEPTO (Departamento) 
Campos: 
 CD_DEPTO CHAR(3) NOT NULL 
 NM_DEPTO VARCHAR2(40) 
 CD_GERENTE NUMBER(5) 
 CD_DEPTO_CTB CHAR(3) 
 
Tabela: 
 FUNC (Funcionário) 
Campos: 
 CD_MAT NUMBER(5) NOT NULL 
 NM_FUNC VARCHAR2(12) 
 NM_SOBRENOME VARCHAR2(12) 
 CD_DEPTO CHAR(3) 
 NR_RAMAL NUMBER(4) 
 DT_ADM DATE 
 NR_CARGO NUMBER(3) 
 NR_RG NUMBER(15) 
 IN_SEXO VARCHAR2(1) 
 DT_NASC DATE 
 VL_SAL NUMBER(9,2) 
 NM_FOTO VARCHAR2(100) 
 
Tabela: 
 PROJ (Projeto) 
Campos: 
 CD_PROJ CHAR(6) NOT NULL 
 NM_PROJ VARCHAR2(30) NOT NULL 
 CD_DEPTO CHAR(3) NOT NULL 
 CD_RESP NUMBER(5) NOT NULL 
 QT_EQP NUMBER(02) 
 DT_INI DATE 
 DT_FIM DATE 
 
Tabela: 
 ATIV (Atividade) 
Campos: 
 CD_ATIV NUMBER(3) 
 NM_SIGLA VARCHAR2(12) 
 TX_DESCRICAO VARCHAR2(30)

Continue navegando

Outros materiais