Baixe o app para aproveitar ainda mais
Prévia do material em texto
A4 - Trabalho de SQL Dupla: João Gabriel Vasconcellos Melão e Orlando Soares Amaral Chaves Matrículas: 20201102196 e 20201106594 Orientações: - Para cada comando SQL executado, deverá constar o print do resultado (conforme apresentado na aula). - Trabalho pode ser feito em dupla. - Data de entrega: 27/06/2022 (via ATIVIDADE do TEAMS) Modelo lógico: 1a Questão - Desenvolva as questões abaixo, em SQL. Questão 1) Implemente o modelo físico no SQL Server: -- CRIA O BANCO, MUDA PARA ELE E CONFIRMA QUE ESTÁ EM USO CREATE DATABASE A4; GO USE A4; GO SELECT DB_NAME(); GO -- CRIANDO AS TABELAS -- Departamento CREATE TABLE Departamento ( DeptoNum INT NOT NULL, DeptNome NVARCHAR(50 ) NOT NULL, MatrGerente INT NULL, CONSTRAINT PK_Departamento PRIMARY KEY (DeptoNum) ); GO ALTER TABLE Departamento ADD CONSTRAINT CHK_Departamento_Supervisor CHECK (LEN([MatrGerente])=(8)); GO ALTER TABLE Departamento ADD CONSTRAINT FK_Departamento FOREIGN KEY (MatrGerente) REFERENCES Empregado(Matricula); GO -- Dependente CREATE TABLE Dependente ( Matricula INT NOT NULL, NomeDepend NVARCHAR(50 ) NOT NULL, Sexo CHAR(1 ) NOT NULL, DataNasc DATE NOT NULL, Parentesco varCHAR(20 ) NULL, CONSTRAINT PK_Dependete PRIMARY KEY (NomeDepend) ); GO ALTER TABLE Dependente ADD CONSTRAINT CHK_Dependente_Sexo CHECK ([Sexo]='M' OR [Sexo]='m' OR [Sexo]='F' OR [Sexo]='f'); GO ALTER TABLE Dependente ADD CONSTRAINT CHK_Dependente_Matricula CHECK (LEN([Matricula])=(8)); GO ALTER TABLE Dependente ADD CONSTRAINT FK_Dependente FOREIGN KEY (Matricula) REFERENCES Empregado(Matricula); GO -- DeptLocal CREATE TABLE DeptoLocal ( Depto INT NOT NULL, Localizacao CHAR(2 ) NOT NULL, CONSTRAINT PK_Depto_Local PRIMARY KEY (Localizacao) ); GO ALTER TABLE DeptoLocal ADD CONSTRAINT FK_Depto_Local FOREIGN KEY (Depto) REFERENCES Departamento(DeptoNum); GO -- Empregado CREATE TABLE Empregado ( Nome NVARCHAR(50 ) NOT NULL, Matricula INT NOT NULL, DataNasc DATE NOT NULL, Endereco NVARCHAR(100 ) NOT NULL, Sexo CHAR(1 ) NOT NULL, Salario FLOAT NOT NULL, Supervisor INT NULL, Depto INT NOT NULL, CONSTRAINT PK_Empregado PRIMARY KEY (Matricula), CONSTRAINT FK_Empregado_Supervisor FOREIGN KEY (Supervisor) REFERENCES Empregado(Matricula) ); GO ALTER TABLE Empregado ADD CONSTRAINT CHK_Empregado_Salario CHECK ([Salario]>(0)); GO ALTER TABLE Empregado ADD CONSTRAINT CHK_Empregado_Sexo CHECK ([Sexo]='M' OR [Sexo]='m' OR [Sexo]='F' OR [Sexo]='f'); GO ALTER TABLE Empregado ADD CONSTRAINT CHK_Empregado_Matricula CHECK (LEN([Matricula])=(8)); GO ALTER TABLE Empregado ADD CONSTRAINT CHK_Empregado_Supervisor CHECK (LEN([Supervisor])=(8)); GO -- Projeto CREATE TABLE Projeto ( PNome NVARCHAR(50 ) NOT NULL, PCodigo INT NOT NULL, PLocalizacao CHAR(2 ) NULL, Depto INT NULL, CONSTRAINT PK_Projeto PRIMARY KEY (PCodigo) ); GO ALTER TABLE Projeto ADD CONSTRAINT FK_Projeto FOREIGN KEY (Depto) REFERENCES Departamento(DeptoNum); GO -- TrabalhaEm CREATE TABLE TrabalhaEm ( Matricula INT NOT NULL, PCodigo INT NOT NULL, Horas INT NOT NULL ); GO ALTER TABLE TrabalhaEm ADD CONSTRAINT CHK_Trabalha_Em_Horas CHECK (LEN([Matricula])>(8)); GO ALTER TABLE TrabalhaEm ADD CONSTRAINT FK_Trabalha_Em FOREIGN KEY (PCodigo) REFERENCES Projeto(PCodigo); GO ALTER TABLE TrabalhaEm ADD CONSTRAINT FK_Trabalha_Em_Matricula FOREIGN KEY (Matricula) REFERENCES Empregado(Matricula); GO Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing Questão 2) Para cada tabela insira 10 registros: -- Cargas Tabelas -- Departamento INSERT INTO Departamento(DeptoNum,DeptNome,MatrGerente) VALUES(11,'Tecnologia',20221101), (12,'Recursos Humanos',20221102), (13,'Marketing',20221103), (14,'Financeiro',20221104), (15,'Jurídico',20221105), (21,'Administrativo',20221106), (22,'Operacional',20221107), (23,'Comercial',20221108), (24,'Projetos',20221109), (25,'Contabilidade',20221110); -- Dependente INSERT INTO Dependente (Matricula,NomeDepend,Sexo,DataNasc,Parentesco) VALUES(20221108,'Ana Beatriz','F','1989-11-22','Mãe'), (20221109,'Estônia Abreu','F','1984-04-15','Mãe'), (20221102,'Leonardo da Silva','M','2021-10-30','Filho'), (20221101,'Lili Victoria','F','2010-07-22','Filha'), (20221104,'Marco Polo','M','1998-05-24','Pai'), (20221105,'Marta Mirian','F','1980-04-03','Mãe'), (20221103,'Matheus Gerúndio','M','1973-03-13','Pai'), (20221107,'Pedro Enrique','M','2021-10-30','Filho'), (20221110,'Renato Gaúcho','M','1978-05-20','Pai'), (20221106,'Vladmir Valmir','M','1985-06-06','Pai'); -- DeptoLocal INSERT INTO DeptoLocal (Depto,Localizacao) VALUES(13,'AC'), (24,'AL'), (22,'DF'), (23,'MA'), (15,'MG'), (25,'RF'), (11,'RJ'), (21,'RR'), (14,'SC'), (12,'SP'); -- Empregado INSERT INTO Empregado (Nome,Matricula,DataNasc,Endereco,Sexo,Salario,Supervisor,Depto) VALUES('Sergio Nascimento',20221101,'1990-07-09','Rua ABC','M',4100.0,NULL,11), ('Cabral Nunes',20221102,'1991-10-05','Rua Apia 44','M',1800.0,20221101,12), ('Cidália Vale',20221103,'1992-12-23','Avenida das Americas','F',2500.0,20221102,13), ('Messias Barrico',20221104,'1997-06-09','Rua Marques de Abrantes 66','M',1900.0,NULL,14), ('Riana Pureza',20221105,'1999-04-12','Rua do Pamoios 105','F',5000.0,20221104,15), ('Fred Roriz',20221106,'2001-08-30','Avenida das Américas 24','M',9999.0,NULL,21), ('Michael Douglas',20221107,'2004-07-01','Rua do Musicista 99','M',7280.0,20221106,22), ('Antonio Nunes',20221108,'2002-01-03','Rua Voluntários da Pátria 108','M',3498.0,NULL,23), ('Rafael Camargo',20221109,'1999-03-17','Rua Cabo Herculano 10','M',4400.0,20221108,24), ('Cintia Domingos',20221110,'2000-06-10','Rua São Clemente 93','F',2999.0,NULL,25); -- Projeto INSERT INTO Projeto (PNome,PCodigo,PLocalizacao,Depto) VALUES('Implementação de Modelo Ágil',11,'SC',24), ('Treinamento Para FP',12,'PR',25), ('Gestão do Desperdício na Produção',22,'RR',22), ('Apuração Balancete',33,'RF',21), ('Abater Casos 2006',44,'MG',15), ('DIRF',55,'DF',14), ('Psicologia Parental',66,'AL',12), ('Promoção de Produto',77,'AC',13), ('Migração Sistema Legado',88,'RJ',11), ('Sustentabilidade',99,'SP',23); -- TrabalhaEm INSERT INTO TrabalhaEm (Matricula,PCodigo,Horas) VALUES(20221101,99,20), (20221102,88,100), (20221103,77,25), (20221104,66,60), (20221105,55,70), (20221106,44,30), (20221107,33,7), (20221108,22,8), (20221109,11,15), (20221110,12,33); Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3) Desenvolva as consultas SQL abaixo. 3.1 – Liste todos os funcionários que ganham entre R$ 1.000,00 e R$ 3.000,00. SELECT LEFT(NOME, CHARINDEX(' ', NOME) - 1) as nome, RIGHT(NOME, CHARINDEX(' ', REVERSE(NOME)) - 1) as SOBRENOME, CONCAT('R$', Salario) AS 'Salário Empregado', Matricula AS 'Matrículas' FROM Empregado WHERE Salario BETWEEN 1000 AND 3000; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.2 – Qual o departamento que pertence o funcionário que possui o maior salário da empresa? SELECT TOP 1 t.Nome AS 'Nome', t.Salario AS 'Salário', Departamento AS 'Departamento' FROM ( SELECT CONCAT('R$', MAX(e.Salario)) AS 'Salario', d.DeptNome AS 'Departamento', e.Nome AS 'Nome' FROM Empregado e INNER JOIN Departamento d ON e.Depto = d.DeptoNum INNER JOIN DeptoLocal dl ON d.DeptoNum = dl.Depto INNER JOIN TrabalhaEm te ON e.Matricula = te.Matricula GROUP BY e.Nome, d.DeptNome) T ORDER BY 1 DESC; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.3 – Liste a quantidade de projetos por departamento. SELECT d.DeptNome AS 'Departamento', COUNT(p.PCodigo)AS 'Qtd Projetos' FROM Projeto p INNER JOIN Departamento d ON p.Depto = d.DeptoNum INNER JOIN TrabalhaEm te ON p.PCodigo = te.PCodigo GROUP BY d.DeptNome; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.4 – Liste o nome do Funcionário e seu respectivo Supervisor. SELECT e1.Nome AS 'Nome Empregado', e1.Matricula AS 'Matrícula Empregado', e2.Nome AS 'Nome Supervisor', e2.Supervisor AS 'Matrícula Supervisor' FROM Empregado e1 INNER JOIN Empregado e2 ON e1.Matricula = e2.Supervisor; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.5 – Qual é a média de horas trabalhadas no projeto de Sustentabilidade? SELECT AVG(Horas) AS 'Média de Horas', P.PNome AS 'Projeto' FROM TrabalhaEm te INNER JOIN Projeto p ON te.PCodigo = p.PCodigo WHERE p.PNome = 'Sustentabilidade' GROUP BY P.PNome; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.6 – Quais os funcionários que possuem o sobrenome Nascimento? SELECT Nome AS 'Nome' FROM Empregado e WHERE NOME LIKE '%Nascimento'; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.7 – Quais os departamentos que não possuem até o momento nenhum projeto? SELECT d.DeptoNum AS 'Código Departamento', d.DeptNome AS 'Departamento' FROM Departamento d WHERE d.DeptoNum NOT IN (SELECT p.Depto FROM Projeto p); Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.8 – Liste o nome dos funcionários que possuem dependentes que nasceram em 2021. SELECT e.Nome AS 'Nome Funcionário', e.Matricula AS 'Matrícula', d.NomeDepend AS 'Nome Dependente', d.Parentesco AS 'Parentesco', REPLACE(FORMAT(d.DataNasc, 'dd-MM-yyyy'), '-', '/') AS 'Data de Nascimento' FROM Empregado e INNER JOIN Dependente d ON e.Matricula = d.Matricula WHERE d.DataNasc LIKE '2021%'; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.9 – Quais os funcionários que trabalham no projeto Reciclagem? SELECT e.Nome AS 'Nome', e.Matricula AS 'Matrícula', p.PNome AS 'Projeto' FROM Empregado e INNER JOIN TrabalhaEm te ON e.Matricula = te.Matricula INNER JOIN Projeto p ON te.PCodigo = p.PCodigo WHERE p.PNome = 'Reciclagem'; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.10 – Quantos funcionários estão alocados no departamento de Tecnologia? SELECT COUNT(e.Matricula) AS 'Matrícula', e.Nome AS 'Nome', d.DeptoNum AS 'Código Departamento', d.DeptNome AS 'Departamento' FROM Empregado e INNER JOIN Departamento d ON e.Depto = d.DeptoNum WHERE d.DeptNome = 'Tecnologia' GROUP BY d.DeptoNum, e.Nome, d.DeptNome; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.11 – Liste o total de dependentes por sexo. SELECT COUNT(*) AS 'Total de Dependentes', Sexo AS 'Sexo' FROM Dependente d WHERE Sexo LIKE 'F' GROUP BY Sexo UNION SELECT COUNT(*) AS 'Total de Dependentes', Sexo AS 'Sexo' FROM Dependente d WHERE Sexo LIKE 'M' GROUP BY Sexo; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 3.12 – Para cada projeto liste os funcionários alocados. SELECT e.Nome AS 'Nome', e.Matricula AS 'Matrícula', p.PNome AS 'Projeto' FROM Empregado e INNER JOIN TrabalhaEm te ON e.Matricula = te.Matricula INNER JOIN Projeto p ON te.PCodigo = p.PCodigo; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing 2a Questão - Conforme explicado em aula, chegou a hora de você propor 4 consultas pertinentes e relevantes ao cenário. Será levado em consideração a complexidade da consulta desenvolvida (Complexidade 1: envolve no máximo 2 tabelas. – Complexidade 2: envolve mais de 2 tabelas, ou conceitos de conjuntos, ou subquery). Consulta Personalizada 1- Foi requisitado pelo RH a ficha completa dos funcionários separados por sexo. SELECT * FROM (SELECT e.Nome AS 'Nome Empregado', e.Matricula AS 'Matrícula', FORMAT(e.DataNasc, 'dd/MM/yyyy') AS 'Data de Nascimento', e.Sexo AS 'Sexo', CONCAT('R$', e.Salario) AS 'Salário', d.DeptNome AS 'Nome Departamento', p.PNome AS 'Projeto Alocado' FROM Empregado e INNER JOIN Departamento d ON e.Depto = d.DeptoNum INNER JOIN Projeto p ON d.DeptoNum = p.Depto WHERE Sexo = 'M' UNION SELECT e.Nome AS 'Nome Empregado', e.Matricula AS 'Matrícula', FORMAT(e.DataNasc, 'dd/MM/yyyy') AS 'Data de Nascimento', e.Sexo AS 'Sexo', CONCAT('R$', e.Salario) AS 'Salário', d.DeptNome AS 'Nome Departamento', p.PNome AS 'Projeto Alocado' FROM Empregado e INNER JOIN Departamento d ON e.Depto = d.DeptoNum INNER JOIN Projeto p ON d.DeptoNum = p.Depto WHERE Sexo = 'F') t ORDER BY t.Sexo; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing Consulta Personalizada 2- A empresa quer realocar alguns funcionários para outros estados, para isso, descubra o grau de parentesco com o funcionário matriculado, o estdado da empresa que ele trabalha atualmente e, caso seja filho/filha, retire-o da pesquisa. Obs: não separe dos pais. SELECT e.Nome AS 'Nome Empregado', e.Matricula AS 'Matrícula', d.DeptNome AS 'Nome Departamento', dl.Localizacao AS 'UF Departamento', d2.Parentesco AS 'Parentesco com o Empregado', d2.NomeDepend AS 'Nome Dependente' FROM Empregado e INNER JOIN Departamento d ON e.Depto = d.DeptoNum INNER JOIN Dependente d2 ON e.Matricula = d2.Matricula INNER JOIN DeptoLocal dl ON d.DeptoNum = dl.Depto WHERE d2.Parentesco NOT IN ('Filho', 'Filha'); Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing Consulta Personalizada 3- Liste onde cada departamento é sediado e quais projetos são compostos apenas por mulheres. SELECT d.DeptNome AS 'Departamento', dl.Localizacao AS 'UF Departamento' FROM Empregado e INNER JOIN Departamento d ON e.Depto = d.DeptoNum INNER JOIN DeptoLocal dl ON d.DeptoNum = dl.Depto WHERE e.Sexo = 'F'; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m- Voh9g?usp=sharing Consulta Personalizada 4- A empresa deseja oferecer uma bonificação de R$ 150,00 para os funcionários dos três setores que mais trabalharam. SELECT TOP 3 e.Nome AS 'Empregado', d.DeptNome AS 'Departamento', te.Horas AS 'Horas Projeto', e.Salario AS 'Salário Base', SUM(e.Salario + 150) AS 'Salário C/ Bônus' FROM Empregado e INNER JOIN TrabalhaEm te ON e.Matricula = te.Matricula INNER JOIN Departamento d ON e.Depto = d.DeptoNum GROUP BY e.Salario, d.DeptNome, te.Horas, e.Nome ORDER BY te.Horas DESC; Obs: link para o drive com as queries em .sql, visto que aqui no Office/PDF fica difícil de formatar → https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m-Voh9g?usp=sharing https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m-Voh9g?usp=sharing https://drive.google.com/drive/folders/1QHGZqANeLiE19L_GOuNAliGZ2m-Voh9g?usp=sharing
Compartilhar