Você está na página 1de 14

FACULDADE DE TECNOLOGIA DE SO PAULO

DEPARTAMENTO DE TECNOLOGIA DA INFORMAO


LBD LABORATRIO DE BANCO DE DADOS
PROF. PAULO ROBERTO BERNICE
1 PROVA

2o. SEMESTRE 2014

ALUNO: LUCAS MIRANDA SILVA


DATA DA ENTREGA( MAX.): 13/10/2014
1)
Um banco de dados relacional um mecanismo de armazenamento que
permite a persistncia de dados e opcionalmente implementar
funcionalidades. Neste contexto, o objetivo deste artigo apresentar uma
viso geral de tecnologias de sistemas de gerenciamento de banco de
dados relacionais (SGBDR) e explorar questes prticas aplicveis ao seu
uso em organizaes modernas. Sendo assim, o objetivo deste artigo no
discutir a teoria relacional.
2)
Convert uma funo do engine do SQL Server. Convert pode ser utilizado
para formatao de valores do tipo datetime e money.

Retorna um valor formatado com o formato e a cultura opcional especificados no SQL


Server 2014. Use a funo FORMAT para formatao com reconhecimento de
localidade de valores de data/hora e nmero como cadeias de caracteres. Para
converses de tipos de dados gerais, use CAST ou CONVERT.
Sintaxe:
CONVERT (data_type [ (length ) ] ,expression [ ,style ] )
FORMAT ( value, format [, culture ] )
3)
Os Comandos JOIN e INNER JOIN no tem diferena nenhuma tanto em
resultado quanto em performance, JOIN apenas a verso simplificado de
INNER JOIN.
J o comando UNION ele combina os resultados de duas ou mais consultas
em um nico conjunto de resultados que inclui todas as linhas que
pertencem a todas as consultas na unio, j o comando INNER JOIN ou JOIN,
voc pode recuperar dados a partir de duas ou mais tabelas com base em
relaes lgicas entre as tabelas. Junta-se indicar como SQL deve usar
dados de uma tabela para selecionar as linhas em outra tabela.
4)

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

1/14

USE BD2N29
go
CREATE TABLE Deprmto
(IdDepto INTEGER NOT NULL,
NomeDepto VARCHAR(20) NOT NULL,
CONSTRAINT PK_Deprmto PRIMARY KEY (IdDepto));
CREATE TABLE Cargo
(IdCargo INTEGER NOT NULL,
Desc_Cargo VARCHAR(40) NOT NULL,
IdcargoConfia INTEGER,
CONSTRAINT PK_Cargo PRIMARY KEY (IdCargo));
CREATE TABLE Projeto
(CodProj INTEGER NOT NULL,
SiglaProf VARCHAR(40) NOT NULL,
DtInicio DATE,
DtFim DATE,
StatusProj VARCHAR(40) NOT NULL,
CONSTRAINT PK_Projeto PRIMARY KEY (CodProj));
CREATE TABLE Divisao
(IdDivisao INTEGER NOT NULL,
IdDepto INTEGER NOT NULL,
NomeDivisao VARCHAR(30) NOT NULL,
CONSTRAINT PK_Divisao PRIMARY KEY(IdDivisao),
CONSTRAINT FK1_Divisao FOREIGN KEY(IdDepto)
REFERENCES Deprmto(IdDepto));
CREATE TABLE Secao
(IdDivisao INTEGER NOT NULL,
IdDepto INTEGER NOT NULL,
IdSecao INTEGER NOT NULL,
NomeDivisao VARCHAR(40) NOT NULL,
CONSTRAINT PK_Secao PRIMARY KEY(IdSecao),
CONSTRAINT FK1_Secao FOREIGN KEY(IdDepto) REFERENCES
Deprmto(IdDepto),
CONSTRAINT FK2_Secao FOREIGN KEY(IdDivisao) REFERENCES
Divisao(IdDivisao));
CREATE TABLE Funcionarios
(IdFuncionario INTEGER NOT NULL,
NomeFuncionario VARCHAR(40) NOT NULL,
DtAdmissao DATE,
IdCargo INTEGER NOT NULL,
VlSalario MONEY,
IdSecao INTEGER NOT NULL,
DtUltferia DATE,
DtDemissao DATE,
CPF VARCHAR(14) NOT NULL,
CONSTRAINT PK_Funcionarios PRIMARY KEY (IdFuncionario),

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

2/14

CONSTRAINT FK1_Funcionarios FOREIGN KEY(IdCargo) REFERENCES


Cargo(IdCargo),
CONSTRAINT FK2_Funcionarios FOREIGN KEY(IdSecao) REFERENCES
Secao(IdSecao));
CREATE TABLE Func_Projeto
(CodProj INTEGER NOT NULL,
IdFuncionario INTEGER NOT NULL,
DtAlocIni DATE,
DtAlocFim DATE,
CONSTRAINT FK1_Func_Projeto FOREIGN KEY(IdFuncionario) REFERENCES
Funcionarios(IdFuncionario),
CONSTRAINT FK2_Func_Projeto FOREIGN KEY(CodProj) REFERENCES
Projeto(CodProj));
--INSERINDO
INSERT INTO
INSERT INTO
INSERT INTO

DEPARTAMENTOS
Deprmto VALUES (1,'CONTABILIDADE');
Deprmto VALUES (2,'RECURSOS HUMANOS');
Deprmto VALUES (3,'DIRETORIA');

--INSERINDO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO

DIVISOES
Divisao VALUES
Divisao VALUES
Divisao VALUES
Divisao VALUES
Divisao VALUES
Divisao VALUES

--INSERINDO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO

CARGOS
Cargo VALUES
Cargo VALUES
Cargo VALUES
Cargo VALUES
Cargo VALUES

(1,1,'CONTABIL CHEFE');
(2,1,'CONTABIL ATENDIMENTO');
(3,2,'RH ATENDIMENTO');
(4,2,'RH INTERNO');
(5,3,'DIRETORES ACIONISTAS');
(6,3,'DIRETORES DEPARTAMENTOS');

(1,'RECEPCIONISTA',1);
(2,'DIRETOR',1);
(3,'AUXILIAR ADM',1);
(4,'CONTADOR',1);
(5,'AUXILIAR CONTABIL',1);

--INSERINDO PROJETOS
INSERT INTO Projeto
VALUES(1,'ATM','13/10/2014','23/10/2014','REQUISITOS');
INSERT INTO Projeto VALUES(2,'COM','13/10/2014','01/11/2014','EM
ANDAMENTO');
INSERT INTO Projeto VALUES(3,'SQL','18/10/2014','23/11/2014','NAO
INICIADO');
INSERT INTO Projeto VALUES(4,'PAC','18/10/2014','28/10/2014','NAO
INICIADO');
--INSERINDO SECOES
INSERT INTO Secao VALUES (1,1,1,'CONTADORES');
INSERT INTO Secao VALUES (3,2,2,'ATENDIMENTO ESPECIAL');
--INSERINDO FUNCIONARIOS

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

3/14

INSERT INTO Funcionarios VALUES(1,'Lucas


Silva','01/01/2014',2,5200.00,1,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(2,'Joao
Silva','01/01/2014',1,1020.00,1,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(3,'Nuno da
Silva','01/01/2014',1,1200.00,1,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(4,'Costa
Alves','01/01/2014',3,1500.00,1,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(5,'Junior
Costa','01/01/2014',3,1700.00,1,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(6,'Lucas
Melo','01/01/2014',2,3200.00,2,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(7,'Joao
Pedro','01/01/2014',1,2000.00,2,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(8,'Silvio da
Silva','01/01/2014',1,2100.00,2,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(9,'Tiago
Alves','01/01/2014',3,1900.00,2,null,null,'12345667890');
INSERT INTO Funcionarios VALUES(10,'Junior
Souza','01/01/2014',3,1800.00,2,null,null,'12345667890');
--INSERINDO FUNCIONARIOS NO PROJETO
INSERT INTO Func_Projeto VALUES (1,1,'13/10/2014',NULL);
INSERT INTO Func_Projeto VALUES (1,2,'14/10/2014',NULL);
INSERT INTO Func_Projeto VALUES (1,3,'15/10/2014',NULL);
INSERT INTO Func_Projeto VALUES (2,4,'14/10/2014',NULL);
INSERT INTO Func_Projeto VALUES (2,5,'13/10/2014',NULL);

SELECT * FROM FUNCIONARIOS;

SELECT * FROM SECAO;

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

4/14

SELECT * FROM FUNC_PROJETO;

SELECT * FROM DIVISAO;

SELECT * FROM DEPRMTO;

SELECT * FROM CARGO;

SELECT * FROM PROJETO;

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

5/14

5)
USE BD2N28
GO
CREATE PROCEDURE GERA_RELATORIO
AS
DECLARE CurSecao
CURSOR FOR SELECT IDDEPTO,IDDIVISAO,IDSECAO FROM SECAO ORDER BY
IDSECAO ,IDDIVISAO,IDDEPTO
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE

@IdDept INTEGER
@IdDivisao INTEGER
@IdSecao INTEGER
@COUNT INTEGER
@ERRO INTEGER

DECLARE @NMDept VARCHAR(40)


DECLARE @NMDivisao VARCHAR(40)
DECLARE @NMSecao VARCHAR(40)
BEGIN TRANSACTION
SET @ERRO = 0
OPEN CurSecao
FETCH NEXT FROM CurSecao INTO @IdDept, @IdDivisao, @IdSecao
WHILE @@FETCH_STATUS = 0
BEGIN
SET @NMSECAO = (SELECT NOMESECAO FROM SECAO WHERE IDSECAO =
@IDSECAO)
SET @NMDIVISAO = (SELECT NOMEDIVISAO FROM DIVISAO WHERE
IDDIVISAO = @IDDIVISAO)
SET @NMDEPT = (SELECT NOMEDEPTO FROM DEPRMTO WHERE IDDEPTO
= @IDDEPT)
SET @COUNT = (SELECT COUNT(*) FROM Funcionarios WHERE
IdSecao = @IdSecao)
IF (@@ERROR <> 0) BEGIN
SET @ERRO = @@ERROR
BREAK
END
PRINT 'SECAO ' + CONVERT(VARCHAR(20), @IDSECAO) + ' ' +
@NMSECAO + ' DIVISO ' + CONVERT(VARCHAR(20), @IDDIVISAO) + ' ' +
@NMDIVISAO + ' DEPTO.'+ CONVERT(VARCHAR(20), @IDDEPT) + ' ' + @NMDEPT
IF (@COUNT > 0)
BEGIN
DECLARE
DECLARE
DECLARE
DECLARE

@IDFUNC INTEGER
@NMFUNC VARCHAR(40)
@CARGO VARCHAR(40)
@SALARIO MONEY

DECLARE CurNomes
CURSOR FOR
SELECT
IdFuncionario,NomeFuncionario,C.Desc_Cargo,VlSalario
FROM Funcionarios F INNER JOIN Cargo C ON
C.IdCargo = F.IdCargo

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

6/14

WHERE IdSecao = @IdSecao


OPEN CurNomes
FETCH NEXT FROM CurNomes INTO @IDFUNC, @NMFUNC,
@CARGO,@SALARIO

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CONVERT(VARCHAR(20), @IDFUNC) + ' '
+ @NMFUNC + ' CARGO ' + @CARGO + ' SALARIO: '+ CONVERT(VARCHAR(20),
@SALARIO)
FETCH NEXT FROM CurNomes INTO @IDFUNC,
@NMFUNC, @CARGO,@SALARIO
END
CLOSE CurNomes
DEALLOCATE CurNomes
END
PRINT 'Total Funcionrios SEO '+ CONVERT(VARCHAR(20),
@IDSECAO)+' QTD.' + CONVERT(VARCHAR(20), @COUNT)
IF (@@ERROR <> 0) BEGIN
SET @ERRO = @@ERROR
BREAK
END
FETCH NEXT FROM CurSecao INTO @IdDept, @IdDivisao, @IdSecao
END
CLOSE CurSecao
DEALLOCATE CurSecao

GO

IF(@ERRO = 0)
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION

EXEC GERA_RELATORIO

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

7/14

6)

USE BD2N28
GO
CREATE TABLE RAMAIS(
CODRAMAL INTEGER NOT NULL,
NUMRAMAL VARCHAR(4),
NOMERAMAL VARCHAR(20),
IDFUNCIONARIO INTEGER NOT NULL,
CONSTRAINT PK_RAMAIS PRIMARY KEY (CODRAMAL),
CONSTRAINT FK1_RAMAIS FOREIGN KEY(IDFUNCIONARIO) REFERENCES
FUNCIONARIOS(IDFUNCIONARIO))
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO

RAMAIS
RAMAIS
RAMAIS
RAMAIS
RAMAIS
RAMAIS
RAMAIS

VALUES(1,'0101','DIRETORIA',1)
VALUES(2,'0101','DIRETORIA',6)
VALUES(3,'1234','RECEPCAO',1)
VALUES(4,'9911','CONTABILIDADE',1)
VALUES(5,'9000','FINANCEIRO',6)
VALUES(6,'0000','EXCLUSIVO',1)
VALUES(7,'9999','GATO NET',3)

SELECT * FROM RAMAIS

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

8/14

CREATE FUNCTION dbo.RAMAIS_FUNCIONARIOS(@NOME VARCHAR(40))


RETURNS TABLE
AS
RETURN
(
SELECT F.NOMEFUNCIONARIO,S.NOMESECAO, R.NUMRAMAL FROM
FUNCIONARIOS F
INNER JOIN SECAO S ON S.IDSECAO = F.IDSECAO
LEFT JOIN RAMAIS R ON R.IDFUNCIONARIO = F.IDFUNCIONARIO
WHERE F.NOMEFUNCIONARIO LIKE('%' + @NOME + '%')
);
GO
SELECT * FROM dbo.RAMAIS_FUNCIONARIOS('SILVA')

7)

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

9/14

CREATE TABLE LOG_SALARIO(


COD_LOG INTEGER NOT NULL IDENTITY(1,1),
ID_FUNCIONARIO_ALTERADO INTEGER NOT NULL,
DATAHORA DATETIME NOT NULL,
VLSALARIO_ANTIGO MONEY NOT NULL,
VLSALARIO_NOVO MONEY NOT NULL,
RESULTADO VARCHAR(40)
)
GO
CREATE TRIGGER SALARIO ON FUNCIONARIOS
FOR UPDATE
AS
DECLARE @SAL_ANT MONEY = (SELECT VLSALARIO FROM DELETED)
DECLARE @SAL_NOVO MONEY = (SELECT VLSALARIO FROM INSERTED)
DECLARE @IDFUNCIONARIO INTEGER = (SELECT IDFUNCIONARIO FROM DELETED)
DECLARE @RESULTADO VARCHAR(40)
IF(@SAL_NOVO < @SAL_ANT)
BEGIN
PRINT 'TRANSAO ANULADA DEVIDO AO SALARIO SER MENOR QUE O
ANTERIOR'
SET @RESULTADO = 'CANCELADO'
UPDATE FUNCIONARIOS
SET VlSalario = @SAL_ANT
WHERE IDFUNCIONARIO IN (SELECT IDFUNCIONARIO FROM INSERTED)
END
ELSE
SET @RESULTADO = 'APROVADO'
INSERT INTO LOG_SALARIO VALUES
(@IDFUNCIONARIO,GETDATE(),@SAL_ANT,@SAL_NOVO,@RESULTADO)
GO

UPDATE Funcionarios
SET VlSalario = 20000
WHERE IdFuncionario = 1

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

10/14

UPDATE Funcionarios
SET VlSalario = 10000
WHERE IdFuncionario = 1

8)
CREATE TRIGGER DEMISSAO ON FUNCIONARIOS
FOR UPDATE
AS
DECLARE @DEM_NOVO DATE = (SELECT DTDEMISSAO FROM INSERTED)
IF (@DEM_NOVO IS NOT NULL)
BEGIN
DECLARE @ID INTEGER = (SELECT IDFUNCIONARIO FROM INSERTED)
UPDATE FUNC_PROJETO
SET DTALOCFIM = @DEM_NOVO
WHERE IDFUNCIONARIO = @ID
END
GO

--ANTES DA DEMISSAO DO FUNCIONARIO COD 1

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

11/14

UPDATE Funcionarios
SET DtDemissao = '12/10/2014'
WHERE IDFUNCIONARIO = 1

SELECT * FROM Func_Projeto

9)
Desculpa porem no entendi o problema.
Adaptar as Tabelas para que o Funcionrio possa ser alocado em
mais de um intervalo de datas ao mesmo Projeto
Na tabela Func_Projeto ele pode ser alocado em quantos projetos quiser e
independente do intervalo entre as datas.
10)
USE BD2N28

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

12/14

GO
CREATE TABLE #PROJETO_ANALISTA(ID_PROJ INTEGER,SIGLA
VARCHAR(4),QTD_ANALISTAS INTEGER,QTD_PROGRAMADORES INTEGER)
GO
INSERT INTO #PROJETO_ANALISTA(ID_PROJ,SIGLA)
SELECT DISTINCT P.CodProj,P.SiglaProf FROM PROJETO P
INNER JOIN FUNC_PROJETO FP ON P.CODPROJ = FP.CODPROJ
GO
--ANALISTAS DOS PROJETOS
SELECT COUNT(*) AS 'TRABALHANDO',P.SiglaProf INTO #PROJ
FROM PROJETO P
INNER JOIN FUNC_PROJETO FP ON P.CODPROJ = FP.CODPROJ
INNER JOIN Funcionarios F ON F.IdFuncionario = FP.IdFuncionario
WHERE IdCargo >= 20 AND IdCargo <=29
GROUP BY SIGLAPROF
UPDATE #PROJETO_ANALISTA
SET QTD_ANALISTAS = B.TRABALHANDO
FROM #PROJETO_ANALISTA A ,#PROJ
B
WHERE A.SIGLA= B.SiglaProf
--PROGRAMADORES DOS PROJETOS
SELECT COUNT(*) AS 'TRABALHANDO',P.SiglaProf INTO #PROJ2
FROM PROJETO P
INNER JOIN FUNC_PROJETO FP ON P.CODPROJ = FP.CODPROJ
INNER JOIN Funcionarios F ON F.IdFuncionario = FP.IdFuncionario
WHERE IdCargo >= 10 AND IdCargo <=19
GROUP BY SIGLAPROF
UPDATE #PROJETO_ANALISTA
SET QTD_PROGRAMADORES = B.TRABALHANDO
FROM #PROJETO_ANALISTA A ,#PROJ2
B
WHERE A.SIGLA= B.SiglaProf
GO
SELECT SIGLA FROM #PROJETO_ANALISTA
WHERE ISNULL(QTD_ANALISTAS,0) < ISNULL(QTD_PROGRAMADORES,0)

--QUAIS CARGOS DOS FUNCIONARIOS DOS PROJETOS


SELECT FP.*, C.Desc_Cargo,PR.SiglaProf FROM Cargo C
JOIN Funcionarios F ON F.IdCargo = C.IdCargo
JOIN Func_Projeto FP ON FP.IdFuncionario = F.IdFuncionario
JOIN Projeto PR ON PR.CodProj = FP.CodProj

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

13/14

Cod. Matr.12100205 nome: Lucas Miranda Silva VERSAO SQL 2008

14/14

Você também pode gostar