quinta-feira, 20 de junho de 2013

Trabalho Data Warehouse

BDII

Trabalho - (link para arquivo)


Faculdade de Educação São Luís - Jaboticabal/SP
Curso de Sistemas de Informação - 7º. Semestre


Integrantes do grupo do Trabalho Final
Fábio Anselmo de Moraes
Gildo Júnior
Junio Pimentel
Richard Nabuco
Vinicius Rafael
Thiago Grillo

quinta-feira, 13 de junho de 2013

LISTA DE EXERCÍCIOS - BDII (continuação)


VISÕES (VIEW)

01 - Crie uma view que mostre a pesquisa que retorna o resultado abaixo:

R: ALTER VIEW VW_ALUNO
AS
SELECT REPLICATE('0',5-(LEN(Cod_Aluno)))+CONVERT(VARCHAR(5),COD_ALUNO) AS CODALUNO,
       Nome_Aluno AS NOME_ALUNO,
       CONVERT(CHAR,Data_Nascimento,103) AS DATA
FROM ALUNO
WHERE Data_Nascimento IS NOT NULL


02 - Crie uma view que aproveitando a view anterior mostre além dos dados do aluno, os dados da disciplina que ele está cursando, como na figura abaixo:
R: CREATE VIEW VW_ALUNO_NOTA
AS
SELECT  DISTINCT
        A.CODALUNO,
        A.NOME_ALUNO,
        A.DATA,
        REPLICATE('0',5-(LEN(D.CODIGO_DISCIPLINA)))+CONVERT(VARCHAR(5),D.codigo_disciplina) AS CODDISCIPLINA,
        CONVERT(DECIMAL(10,2),M.NOTA) AS NOTA,
        CASE M.SITUACAO       
          WHEN 'NOK' THEN 'REPROVADO'
          WHEN 'OK' THEN 'APROVADO'
          ELSE 'NÃO DEFINIDO'
        END AS SITUACAO
FROM VW_ALUNO A, Matricula M, Disciplina D
WHERE A.CODALUNO=M.cod_Aluno
  AND M.cod_Disciplina=D.codigo_disciplina
 


03 - Crie uma view que aproveitando a view anterior mostre além dos dados do aluno e os dados da disciplina que ele está cursando, mostre os dados da disciplina como na figura abaixo:
R: CREATE VIEW VW_ALUNO_DISCIPLINA_NOTA
AS
SELECT DISTINCT
       V.CODALUNO,
       V.NOME_ALUNO,
       V.DATA,
       V.CODDISCIPLINA,
       D.NOME AS DISCIPLINA,
       (SELECT CASE 
                 WHEN D.pre_requisito IS NOT NULL THEN (SELECT D2.NOME FROM DISCIPLINA D2 WHERE D2.codigo_disciplina=D.pre_requisito)
                 WHEN D.pre_requisito IS NULL THEN  'NÃO POSSUI'
                END) AS PREREQUISITO,
       D.creditos AS CREDITOS,
       V.NOTA,
       V.SITUACAO
FROM VW_ALUNO_NOTA V,Disciplina D
WHERE D.codigo_disciplina=V.CODDISCIPLINA


04 - Crie uma view que aproveitando a view anterior mostre além dos dados do aluno, os dados da disciplina que ele está cursando, mostre os dados do professor da disciplina como na figura abaixo:
R: CREATE VIEW VW_ALUNO_NOTA_PROFESSOR
AS
SELECT DISTINCT
        V.CODALUNO,
        V.NOME_ALUNO,
        V.DATA,
        V.CODDISCIPLINA,
        V.DISCIPLINA,
        V.PREREQUISITO,
        V.CREDITOS,
        V.NOTA,
        V.SITUACAO,
        REPLICATE('0',5-(LEN(P.cod_professor)))+CONVERT(VARCHAR(5),P.cod_professor) AS CODPROFESSOR,
        P.nome_professor AS PROFESSOR
FROM VW_ALUNO_DISCIPLINA_NOTA V, DISCIPLINA D, Professor P
WHERE P.cod_professor=D.cod_prof
  AND D.codigo_disciplina=V.CODDISCIPLINA


05 - Crie uma view com o nome de VW_BOLETIM que aproveitando a view com os dados do aluno e os dados da disciplina que ele está cursando, mostre os dados da Média Geral da disciplina e o Desvio Padrão da nota do aluno como na figura abaixo:
R: CREATE VIEW VW_BOLETIM
AS
SELECT DISTINCT
        V.CODALUNO,
        V.NOME_ALUNO,
        V.DATA,
        V.CODDISCIPLINA,
        V.DISCIPLINA,
        V.PREREQUISITO,
        V.CREDITOS,
        V.NOTA,
        V.SITUACAO,   
        (SELECT CONVERT(DECIMAL(10,2),AVG(NOTA)) FROM MATRICULA WHERE cod_Disciplina=V.CODDISCIPLINA) AS MEDIA_GERAL,
        (V.NOTA-(SELECT CONVERT(DECIMAL(10,2),AVG(NOTA)) FROM MATRICULA WHERE cod_Disciplina=V.CODDISCIPLINA)) AS DESVIO_PADRAO

FROM VW_ALUNO_DISCIPLINA_NOTA V
--WHERE CODDISCIPLINA=1


06 - Crie uma view com o nome de VW_BOLETIM_COMPARATIVO que aproveitando a view anterior, mostre os dados da Menor e da Maior nota da disciplina como na figura abaixo:
R: CREATE VIEW VW_BOLETIM_DETALHADO
AS
SELECT DISTINCT
        V.CODALUNO,
        V.NOME_ALUNO,
        V.DATA,
        V.CODDISCIPLINA,
        V.DISCIPLINA,
        V.PREREQUISITO,
        V.CREDITOS,
        V.NOTA,
        V.SITUACAO,   
        V.MEDIA_GERAL,
        V.DESVIO_PADRAO,
        (SELECT MIN(V2.NOTA) FROM VW_BOLETIM V2 WHERE V2.CODDISCIPLINA=V.CODDISCIPLINA) AS MENOR_NOTA,
        (SELECT MAX(V2.NOTA) FROM VW_BOLETIM V2 WHERE V2.CODDISCIPLINA=V.CODDISCIPLINA) AS MAIOR_NOTA               
FROM VW_BOLETIM V




TRIGGERS (GATILHOS)

01 - Crie uma trigger que ao inserir um novo professor ela exiba na tela a seguinte mensagem:


FOI INSERIDO UM PROFESSOR COM OS SEGUINTES DADOS:

CÓDIGO: <código>
      NOME: <nome>

R: create trigger NovoProfessor on [Professor]

for insert as
DECLARE @CODIGO INT, @NOME VARCHAR(50)


SELECT @CODIGO=cod_professor, @NOME=nome_professor
  FROM inserted
 
  print 'FOI INSERIDO UM PROFESSOR COM OS SEGUINTES DADOS:'
  print ''
  print 'Codigo: '+convert(varchar(10),@codigo)
  print 'Professor: '+@nome
 
  insert into Professor values (1, 'William')


02 - Crie uma trigger que ao alterar os dados de um professor ela exiba na tela a seguinte mensagem:


FOI ALTERADO OS DADOS DO PROFESSOR:

CÓDIGO: <código>
      NOME: <nome>
      QUE DÁ AULA EM 0 DISCIPLINAS.

R: CREATE TRIGGER TR_PROFESSOR

ON PROFESSOR
FOR UPDATE
AS BEGIN

            DECLARE @CODIGO INT, @PROFESSOR VARCHAR(50), @QTD INT
           
            SELECT @CODIGO=cod_professor, @PROFESSOR=nome_professor FROM deleted
           
            SELECT @QTD=COUNT(*) FROM Disciplina WHERE cod_prof=@CODIGO
           
            PRINT 'FOI ALTERADO OS DADOS DO PROFESSOR: '
            PRINT ''
            PRINT 'CÓDIGO: '+CONVERT(VARCHAR(10),@CODIGO)
            PRINT 'NOME: '+@PROFESSOR
            PRINT 'QUE DÁ AULA EM '+CONVERT(VARCHAR(5),@QTD)+' DISCIPLINAS.'
           
END

update Professor set nome_professor='Daiane' where cod_professor = 1
insert into Professor values (1, 'William')
SELECT * FROM Professor


03 - Crie uma trigger que ao inserir/alterar dados na tabela disciplina e não for atribuído um professor a mesma exiba uma pesquisa com todos os professores cadastrados no banco.

R: CREATE TRIGGER TR_DISCIPLINA

ON DISCIPLINA
FOR INSERT, UPDATE
AS BEGIN

            IF ((SELECT COUNT(*) FROM inserted WHERE cod_prof IS NULL)>0) BEGIN
                       
                        SELECT * FROM Professor ORDER BY nome_professor
                       
            END
           
END

INSERT INTO Disciplina (codigo_disciplina,nome,pre_requisito,creditos,cod_prof)
VALUES (8, 'Engenharia de Software',null,2,null)

update Disciplina set cod_prof=222 where codigo_disciplina=8

select * from Disciplina
select * from Professor


04 - Crie uma trigger que ao apagar os dados da tabela matrícula, mostre na tela a seguinte mensagem:


OS DADOS ABAIXO FORAM APAGADOS DA TABELA MATRICULA:

CÓDIGO DO ALUNO: <código_aluno>
NOME DO ALUNO: <nome_aluno>
CÓDIGO DA DISCIPLINA: <código_disciplina>
NOME DA DISCIPLINA: <nome_disciplina>
CÓDIGO DO PROFESSOR: <código_professor>
NOME DO PROFESSOR: <nome_professor>
            SITUAÇÃO: <APROVADO  / REPROVADO>

R: CREATE TRIGGER TR_APAGAR_MATRICULA

ON MATRICULA
FOR DELETE
AS BEGIN

            DECLARE @CODIGOALUNO INT, @ALUNO      VARCHAR(50),
                                   @CODIGODISC  INT, @DISCIPLINA VARCHAR(50),
                                   @CODIGOPROF  INT, @PROFESSOR  VARCHAR(50),
                                   @SITUACAO    CHAR(10)
           
            SELECT @CODIGOALUNO=COD_ALUNO, @CODIGODISC=COD_DISCIPLINA, @SITUACAO=CASE(situacao)
                        WHEN 'OK' THEN 'APROVADO'
                        WHEN 'NOK' THEN 'REPROVADO'
            END
              FROM deleted            
             
             
            SELECT @ALUNO=ALUNO.Nome_Aluno  FROM Aluno WHERE ALUNO.Cod_Aluno=@CODIGOALUNO
           
            SELECT @DISCIPLINA=DISCIPLINA.nome, @CODIGOPROF=PROFESSOR.cod_professor, @PROFESSOR=PROFESSOR.nome_professor 
            FROM Disciplina, Professor
            WHERE Disciplina.cod_prof=Professor.cod_professor
              AND DISCIPLINA.codigo_disciplina=@CODIGODISC
           
           
           
            PRINT 'OS DADOS ABAIXO FORAM APAGADOS DA TABELA MATRICULA: '
            PRINT ''
            PRINT 'CÓDIGO DO ALUNO: '+CONVERT(VARCHAR(10),@CODIGOALUNO)
            PRINT 'NOME DO ALUNO: '+@ALUNO
            PRINT 'CÓDIGO DA DISCIPLINA: '+CONVERT(VARCHAR(10),@CODIGODISC)
            PRINT 'NOME DA DISCIPLINA: '+@DISCIPLINA
            PRINT 'CÓDIGO DO PROFESSOR: '+CONVERT(VARCHAR(10),@CODIGOPROF)
            PRINT 'NOME DO PROFESSOR: '+@PROFESSOR
            PRINT 'SITUACAO: '+@SITUACAO
           
END

DELETE FROM Matricula WHERE cod_Aluno=222 AND cod_Disciplina=2
SELECT * FROM Matricula


05 - Crie uma trigger que altere/insira automaticamente a situação de uma disciplina quando a nota dessa disciplina for modificada ou inserida. Para nota abaixo de 5 a situação de ser igual a ‘NOK’, quando a nota for igual ou maior que 5, a situação deve ser igual a ‘OK’.

R: CREATE TRIGGER TR_MATRICULA
ON MATRICULA
FOR INSERT, UPDATE
AS BEGIN

            DECLARE @CODALUNO INT, @CODDISC INT, @NOTA DECIMAL(4,2)
           
            SELECT @CODALUNO=COD_ALUNO, @CODDISC=COD_DISCIPLINA, @NOTA=NOTA FROM inserted
           
            IF (@NOTA>=5) BEGIN
           
                        UPDATE Matricula SET situacao='OK' WHERE cod_Aluno=@CODALUNO AND cod_Disciplina=@CODDISC
                       
            END
            ELSE BEGIN
           
                        UPDATE Matricula SET situacao='NOK' WHERE cod_Aluno=@CODALUNO AND cod_Disciplina=@CODDISC
           
            END

END

SELECT * FROM Matricula
INSERT INTO Matricula (cod_Aluno, cod_Disciplina, nota, situacao)
VALUES (111,8,4,'OK')

UPDATE Matricula SET NOTA=5 WHERE cod_Aluno=222 AND cod_Disciplina=6


06 - Crie uma tabela de Log (TB_LOG) que contenha DATA (DATETIME), AÇÃO (VARCHAR(10)), TABELA (NVARCHAR(30)),  USUÁRIO (NVARCHAR(15)) e OBSERVAÇÃO (NVARCHAR(1000)) e as triggers que a alimente quando for realizada qualquer operação nas tabelas do BD. Exemplo de conteúdo da tabela de log:
R: ALTER TRIGGER TR_LOG_ALUNO
ON ALUNO
FOR INSERT, UPDATE, DELETE
AS BEGIN

            DECLARE @QTDI INT, @QTDD INT,
                    @CODI INT, @NOMEI VARCHAR(50), @DATAI DATETIME,
                                   @CODD INT, @NOMED VARCHAR(50), @DATAD DATETIME,
                                   @ACAO VARCHAR(10),@OBSERVACAO VARCHAR(1000), @USUARIO VARCHAR(15), @TABELA VARCHAR(30), @DATAT DATETIME
           
            SELECT @QTDI=COUNT(*) FROM inserted
            SELECT @QTDD=COUNT(*) FROM deleted
           
            SELECT @USUARIO=SYSTEM_USER
            SELECT @DATAT=CONVERT(VARCHAR(10),GETDATE(),103)
           
            IF (@QTDI>0 AND @QTDD>0) BEGIN
           
                        SET @ACAO='ALTEROU'
                       
                        SELECT @CODI=COD_ALUNO, @NOMEI=NOME_ALUNO, @DATAI=DATA_NASCIMENTO FROM inserted
                        SELECT @CODD=COD_ALUNO, @NOMED=NOME_ALUNO, @DATAD=DATA_NASCIMENTO FROM deleted
                       
                        SELECT @OBSERVACAO='NOVO = CODIGO: '+CONVERT(VARCHAR(10), @CODI)+' - NOME: '+@NOMEI+' - DATA NASCIMENTO: '+CONVERT(VARCHAR(10),@DATAI,103)+
                                ' | VELHO = CODIGO: '+CONVERT(VARCHAR(10), @CODD)+' - NOME: '+@NOMED+' - DATA NASCIMENTO: '+CONVERT(VARCHAR(10),@DATAD,103)
                       
                        END
                        ELSE BEGIN
                       
                        IF (@QTDI>0) BEGIN
           
                                   SET @ACAO='INSERIU'
                                  
                                   SELECT @CODI=COD_ALUNO, @NOMEI=NOME_ALUNO, @DATAI=DATA_NASCIMENTO FROM inserted
                                  
                                   SELECT @OBSERVACAO='CODIGO: '+CONVERT(VARCHAR(10), @CODI)+' - NOME: '+@NOMEI+' - DATA NASCIMENTO: '+CONVERT(VARCHAR(10),@DATAI,103)
                                  
                        END
                        ELSE BEGIN
                                  
                        SET @ACAO='APAGOU'
                       
                        SELECT @CODI=COD_ALUNO, @NOMEI=NOME_ALUNO, @DATAI=DATA_NASCIMENTO FROM deleted
                       
                        SELECT @OBSERVACAO='CODIGO: '+CONVERT(VARCHAR(10), @CODD)+' - NOME: '+@NOMED+' - DATA NASCIMENTO: '+CONVERT(VARCHAR(10),@DATAD,103)
                       
                        END
                       
                        SELECT @TABELA='ALUNO'
                       
                        INSERT INTO TB_LOG (DATA, ACAO, TABELA, USUARIO, OBSERVACAO)
                        VALUES (@DATAT, @ACAO, @TABELA, @USUARIO, @OBSERVACAO)
                       
            END
                       
END

select * from Aluno
select * from tb_log
insert into Aluno values (4, 'William', '')
SELECT * FROM sys.tables


STORED PROCEDURE (PROCEDIMENTOS)

01 - Crie uma stored procedure que gerencie a inserção de um novo professor, ela deve tratar as informações, buscando garantir que não exista um professor com o mesmo nome (inserção duplicada) e após a inserção exiba na tela os dados inseridos.

R: create procedure ins_prof

@nome nvarchar (50),
@codigo int
as begin

            declare @nro int
           
            select @nro=count(*)
            from professor
            where cod_professor=@codigo or nome_professor=@nome
           
            if (@nro>0) begin
                        print 'NÃO PODE SER CADASTRADO!'
            END
            ELSE BEGIN
           
                        INSERT INTO Professor (cod_professor, nome_professor) values (@codigo, @nome)
                       
                        select * from Professor where cod_professor=@codigo
            end
End

exec ins_prof 'Maria', '1111'

select * from professor


02 - Crie uma stored procedure que gerencie a inserção de um novo aluno, ela deve tratar as informações, buscando garantir que não exista uma inserção duplicada, para isso utilize a data de nascimento do aluno e o nome do mesmo e após a inserção exiba na tela a seguinte os dados inseridos.

R: create procedure ins_aluno

@nomealuno nvarchar (50),
@dtnasc date
as begin

            declare @nro int, @codaluno int
            select @nro=count(*)
            from Aluno
            where Data_Nascimento=@dtnasc and Nome_Aluno=@nomealuno
           
            if (@nro>0) begin
                        print 'ALUNO JA CADASTRADO!'
            END
            ELSE BEGIN
           
                select @codaluno=MAX(cod_aluno)+1 from Aluno
           
                        INSERT INTO Aluno (Cod_Aluno, Nome_Aluno, Data_Nascimento) values (@codaluno,@nomealuno,@dtnasc)
                       
                        select * from Aluno where Data_Nascimento=@dtnasc and Nome_Aluno=@nomealuno
            end
End

exec ins_aluno 'Fernanda', '16-12-1988'

select * from Aluno

select * from aluno
--delete from Aluno where Cod_Aluno>=1379


03 - Crie uma stored procedure que gerencie a inserção de uma nova disciplina, ela deve tratar as informações, buscando garantir que não exista uma inserção duplicada, para isso utilize o nome da disciplina e após a inserção exiba na tela a seguinte os dados inseridos.

R: create procedure ins_disciplina

@nomedisciplina nvarchar (50)
as begin

            declare @nro int, @coddisc int, @credito int
            select @nro=count(*)
            from Disciplina
            where nome = @nomedisciplina
           
            if (@nro>0) begin
                        print 'DISCIPLINA JA CADASTRADA!'
            END
            ELSE BEGIN
           
                select @coddisc=MAX(codigo_disciplina)+1,
                                      @credito=MAX(creditos)+1
                  from Disciplina
           
                        INSERT INTO Disciplina(codigo_disciplina, nome, creditos) values (@coddisc,@nomedisciplina, @credito)
                       
                        select * from Disciplina where nome = @nomedisciplina
            end
End

exec ins_disciplina 'Contabilidade'

select * from Disciplina


04 - Crie uma stored procedure que gerencie a inserção de uma nova matricula numa disciplina, ela deve tratar as informações, buscando garantir que não exista uma inserção duplicada, para isso utilize o código do aluno e o código da disciplina e após a inserção exiba na tela a seguinte os dados inseridos.

R: create procedure ins_matricula

@cod_aluno int, @cod_disc int
as begin

            declare @nro int
            select @nro=count(*)
            from Matricula
            where cod_Aluno = @cod_aluno
              and cod_Disciplina = @cod_disc
           
            if (@nro>0) begin
                        print 'MATRICULA JA CADASTRADA!'
            END
            ELSE BEGIN
           
                        INSERT INTO Matricula(cod_Aluno, cod_Disciplina) values (@cod_aluno, @cod_disc)
                       
                        select * from Matricula where cod_Aluno = @cod_aluno and cod_Disciplina = @cod_disc
            end
End

exec ins_matricula '100', '1'

select * from Matricula


05 - Crie uma stored procedure que através da passagem do código do professor exiba quais disciplinas o mesmo ministra.

R: create procedure PROFESSOR_DISCIPLINA

@cod int
as begin
           
            select CODPROFESSOR=p.cod_professor, PROFESSOR=p.nome_professor,
                   CODIGODISCIPLINA=d.codigo_disciplina, DISCIPLINA=d.nome
            from Professor p, Disciplina d
            where d.cod_prof=p.cod_professor
              and p.cod_professor=@cod
           
            if (@@ROWCOUNT=0) begin
                        print 'NENHUM PROFESSOR MATRICULADO NESSA DISCIPLINA!'
            END
End

exec PROFESSOR_DISCIPLINA 111

select * from professor


06 - Crie uma stored procedure que através da passagem do código da disciplina exiba quais alunos estão matriculados na mesma e o seu respectivo professor.
R: create procedure ALUNO_DISCIPLINA_PROFESSOR
@cod int
as begin
           
            select coddisciplina=d.codigo_disciplina, Disciplina=d.nome, codigoaluno=a.Cod_Aluno, Aluno=a.Nome_Aluno,
                           codprofessor=p.cod_professor, Professor=p.nome_professor
            from Aluno a, Matricula m, Disciplina d, Professor p
            where a.Cod_Aluno=m.cod_Aluno
              and m.cod_Disciplina=d.codigo_disciplina
              and d.cod_prof=p.cod_professor
              and m.cod_Disciplina=@cod
           
            if (@@ROWCOUNT=0) begin
                        print 'NENHUM ALUNO MATRICULADO NESSA DISCIPLINA!'
            END
End

exec ALUNO_DISCIPLINA_PROFESSOR 2


07 - Crie uma stored procedure que através da passagem do código do aluno exiba o boletim escolar do aluno conforme o layout abaixo:
R: create procedure BOLETIM
@cod int
as begin
           
            select CODALUNO=replicate('0',5-len(a.Cod_Aluno))+CONVERT(varchar(5),a.Cod_Aluno), ALUNO=a.Nome_Aluno,
                   DATA=convert(char,a.Data_Nascimento,103),
                   CODDISCIPLINA=replicate('0',5-len(d.codigo_disciplina))+CONVERT(varchar(5),d.codigo_disciplina),
                   DISCIPLINA=d.nome,PREREQUISITO=case(d.pre_requisito) when 1 then 'Banco de Dados I' when 4 then 'Sistemas de Informação I'
                   else 'NÃO POSSUI' end, CREDITOS=d.creditos, NOTA=m.nota,
                   SITUACAO=case(m.situacao) when 'OK' then 'APROVADO' when 'NOK' then 'REPROVADO' else 'NÃO DEFINIDO' end,
                           MEDIA_GERAL=(SELECT CONVERT(CHAR(5),CONVERT(NUMERIC(4,2),AVG(M2.NOTA))) FROM MATRICULA M2 WHERE M.COD_DISCIPLINA=M2.COD_DISCIPLINA),
                           DESVIO_PADRAO=(m.nota-(select CONVERT(CHAR(5),CONVERT(NUMERIC(4,2),AVG(M2.NOTA))) FROM MATRICULA M2 WHERE M.COD_DISCIPLINA=M2.COD_DISCIPLINA)),
                           MENOR_NOTA =(SELECT CONVERT(CHAR(5),CONVERT(NUMERIC(4,2),MIN(M2.NOTA))) FROM MATRICULA M2 WHERE M.COD_DISCIPLINA=M2.COD_DISCIPLINA),
                           MAIOR_NOTA =(SELECT CONVERT(CHAR(5),CONVERT(NUMERIC(4,2),MAX(M2.NOTA))) FROM MATRICULA M2 WHERE M.COD_DISCIPLINA=M2.COD_DISCIPLINA)
            from Aluno a, Matricula m, Disciplina d
            where a.Cod_Aluno=m.cod_Aluno
              and m.cod_Disciplina=d.codigo_disciplina
              and m.cod_Aluno=@cod
            group by a.Cod_Aluno, a.Nome_Aluno, a.Data_Nascimento, d.codigo_disciplina, d.nome,
                     d.pre_requisito, d.creditos, m.nota, m.situacao, m.cod_Disciplina
           
            if (@@ROWCOUNT=0) begin
                        print 'ALUNO NAO CADASTRADO!'
            END
End

exec BOLETIM 00222


08 - Crie uma stored procedure que através da passagem da data atual, execute o procedimento de backup full do banco de dados.

R: create procedure SP_BACKUP

@DATA DATETIME
AS BEGIN

            DECLARE @DIA SMALLINT, @MES SMALLINT, @ANO INT, @ARQ VARCHAR(50)
           
            SELECT @DIA=DAY(@DATA), @MES=MONTH(@DATA), @ANO=YEAR(@DATA)
           
            SET @ARQ='C:\BKP\ESCOLA_' +CONVERT(VARCHAR(2),@DIA+''+CONVERT(VARCHAR(2), @MES)+''+CONVERT(VARCHAR(4), @ANO)+'.BAK')
           
            BACKUP DATABASE ESCOLA
            TO DISK ='C:\BKP\ESCOLA.BAK'
            WITH STATS=1

END

DECLARE @D DATETIME
SELECT @D=GETDATE()
EXEC SP_BACKUP (SELECT GETDATE())


09 - Crie uma stored procedure que através da passagem do nome do arquivo de backup, execute o procedimento de restaurar o backup do banco de dados.

R: CREATE PROCEDURE SP_RESTORE

@NOME VARCHAR(50)
AS BEGIN

RESTORE DATABASE TESTE
FROM DISK='D:\BKP\TESTE.BAK'
WITH REPLACE, NORECOVERY, STATS=1

END



terça-feira, 9 de abril de 2013

LISTA DE EXERCÍCIOS - BDII

TOP E DISTINCT

01 - Selecione as 10 primeiras matrículas do curso:
R: select top 10 *
from Matricula

02 - Selecione as 5 primeiras disciplinas cadastradas:
R: select top 5 *
from Disciplina

03 - Selecione os 2 primeiros alunos cadastrados:
R: select top 2 *
from Aluno

04 - Selecione os 2 últimos alunos cadastrados:
R: select top 2 *
from Aluno order by Cod_Aluno desc

05 - Selecione as 5 primeiras notas diferentes em ordem crescente:
R: select distinct top 5 nota
from Matricula


LIKE, NULL, NOT NULL E BETWEEN

01 - Selecione todos os alunos cujo nome começa com ‘jo’:
R: select *
from Aluno
where Nome_Aluno like 'jo%'

02 - Selecione todos os alunos cujo nome termina com ‘a’:
R: select *
from Aluno
where Nome_Aluno like '%a'

03 - Selecione todos os alunos cujo nome contenha ‘an’:
R: select *
from Aluno
where Nome_Aluno like '%an%'

04 - Selecione todos os alunos que não tenham data de nascimento cadastrada:
R: select *
from Aluno
where Data_Nascimento is null

05 - Selecione todas as matriculas cujos alunos não tem nota:
R: select *
from Matricula
where nota is null

06 - Selecione todas as disciplinas que não tenham pré-requisitos:
R: select *
from Disciplina
where pre_requisito is null

07 - Selecione todas as disciplinas que tenha professor cadastrados:
R: select *
from Disciplina
where cod_prof is not null

08 - Selecione todas as matrículas que tenha todos os dados cadastrados:
R: select *
from Matricula
where nota is not null and situacao is not null

09 - Selecione todas as matrículas das disciplinas cujo código está entre 2 e 4:
R: select *
from Disciplina
where codigo_disciplina between 2 and 4

10 - Selecione todas as matrículas que contenha os alunos que tiraram nota entre 5 e 8 na disciplina com código 2:
R: select *
from Matricula
where nota between 5 and 8 and cod_Aluno = 2

11 - Selecione todos os alunos que nasceram entre os anos de 1980 e 1982:
R: select *
from Aluno
where year (Data_Nascimento)
Between 1980 and 1982


COMPARAÇÃO CONJUNTOS – SUB-QUERYS

01 - Mostre todos os alunos que obtiveram nota maior que o aluno código = 222 na disciplina código = 2:
R: select *
from Matricula
where nota >  (select nota  from matricula where cod_Disciplina = 2 and      cod_Aluno = 222)

02 - Mostre todas as disciplinas cujo crédito é maior que o crédito da disciplina código = 5:
R: select *
from Disciplina
where creditos > ( select creditos from Disciplina where codigo_disciplina = 5)

03 - Mostre todos os alunos que obtiveram nota maior que o aluno código = 333 na disciplina código = 5:
R: select *
from Matricula
where nota > (select nota from Matricula where cod_Aluno = 333 and cod_Disciplina = 5)
 --and cod_Disciplina = 5

04 - Mostre todos os alunos que obtiveram nota menor que o aluno código = 333 na disciplina código = 2:
R: select *
from Matricula
where nota < (select nota from Matricula where cod_Aluno = 333 and cod_Disciplina = 2)

05 - Mostre todos os alunos que obtiveram média menor que a média geral das notas:
R: select cod_aluno, avg(nota) as media from matricula
group by cod_aluno
having avg(nota) < (select avg(nota) from matricula)


JOIN

01 - Mostre o Nome do Aluno e o Nome das Disciplinas que ele está cursando:
R: select a.nome_aluno, d.nome
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina

02 - Mostre o Nome do Professor e o Nome das Disciplinas que ele está ministrando:
R: select p.nome_professor, d.nome
from professor p
inner join disciplina d on d.cod_prof=p.cod_professor

03 - Mostre o Nome do Aluno e o Nome dos seus Professores:
R: select a.nome_aluno, p.nome_professor
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
inner join professor p on p.cod_professor=d.cod_prof

04 - Mostre o Nome do Aluno, Nome da Disciplina que ele está cursando e o Nome do Professor da Disciplina:
R: select a.nome_aluno, d.nome, p.nome_professor
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
inner join professor p on p.cod_professor=d.cod_prof

05 - Mostre o Nome do Aluno e o nome das Disciplinas na qual ele passou:
R: select a.nome_aluno, d.nome
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
where m.situacao='ok'

06 - Mostre o Nome do Aluno e o nome das Disciplinas na qual ele não passou:
R: select a.nome_aluno, d.nome
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
where m.situacao='nok'

07 - Mostre o Nome do Aluno, o nome das Disciplinas na qual ele passou, o nome do professor da disciplina e a sua nota:
R: select a.nome_aluno, d.nome, p.nome_professor, m.nota
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
inner join professor p on p.cod_professor=d.cod_prof
where m.situacao='ok'

08 - Mostre o Nome do Aluno, Nome da Disciplina que ele está cursando e o Nome do Professor da Disciplina, a nota que ele tirou e a média das notas da turma nessa disciplina:
R: select a.nome_aluno,
       d.nome,
       p.nome_professor,
       m.nota,
      (select avg(nota)
       from matricula m2
       where m2.cod_disciplina=m.cod_disciplina) as media
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
inner join professor p on p.cod_professor=d.cod_prof



TRATAMENTO DE DATAS

01 - Mostre o Nome dos Alunos que nasceram no dia 5:
R: select nome_aluno
from aluno
where day(data_nascimento)=5

02 - Mostre o Nome dos Alunos que nasceram no mês 12:
R: select nome_aluno
from aluno
where month(data_nascimento)=12

03 - Mostre o Nome dos Alunos que nasceram após 1980:
R: select nome_aluno
from aluno
where year(data_nascimento)>1980
 
04 - Mostre o Nome dos Alunos e a Matérias cursadas pelos alunos que nasceram entre os anos de 1980 e 1982:
R: select a.nome_aluno,
       d.nome
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
where year(data_nascimento) between 1980 and 1982
 
05 - Mostre o Nome, a idade em anos e os nomes dos professores dos Alunos:
R: select a.nome_aluno,
       datediff(yy,a.data_nascimento, getdate()),
       p.nome_professor
from aluno a
inner join matricula m on m.cod_aluno=a.cod_aluno
inner join disciplina d on d.codigo_disciplina=m.cod_disciplina
inner join professor p on p.cod_professor=d.cod_prof
 
06 - Mostre o Nome dos Alunos e o dia da semana em que ele nasceu (em português):
R: select nome_aluno,
           case datename(dw, data_nascimento)
              when 'sunday' then 'domingo'
              when 'monday' then 'segunda-feira'
              when 'tuesday' then 'terça-feira'
              when 'wednesday' then 'quarta-feira'
              when 'thursday' then 'quinta-feira'
              when 'friday' then 'sexta-feira'
              when 'saturday' then 'sábado'
              else null
           end as dia 
from aluno
 
07 - Mostre quantos dias já se passaram do início das aulas (09/02/2009) até hoje:
R: select datediff(dd,'02-09-2009',getdate())
 
08 - Mostre o dia da semana (em inglês) do dia em que você nasceu:
R: select datename(dw,'09-09-1989')
 
09 - Mostre o dia da semana (em inglês) do dia de hoje no ano que vem:
R: select datename(dw,dateadd(yy,1,getdate()))
 
10 - Mostre a data de hoje por extenso no formato do exemplo a seguir. Ex: Quarta-feira, 05 de março de 2009:
R: select    dia=case datename(dw, getdate())
              when 'sunday' then 'domingo'
              when 'monday' then 'segunda-feira'
              when 'tuesday' then 'terça-feira'
              when 'wednesday' then 'quarta-feira'
              when 'thursday' then 'quinta-feira'
              when 'friday' then 'sexta-feira'
              when 'saturday' then 'sabado'
              else null
           end+', '+convert(char(2),day(getdate()))+' de '+
               case datepart(mm, getdate())
              when 1 then 'janeiro'
              when 2 then 'fevereiro'
              when 3 then 'março'
              when 4 then 'abril'
              when 5 then 'maio'
              when 6 then 'junho'
              when 7 then 'julho'
              when 8 then 'agosto'
              when 9 then 'setembro'
              when 10 then 'outubro'
              when 11 then 'novembro'
              when 12 then 'dezembro'
           end+' de '+convert(varchar(15),year(getdate()))
 
 
CONVERSÃO DE DADOS
 
01 - Mostre a pesquisa que retorna o resultado abaixo:
R: select nome_aluno, convert(char,data_nascimento,103) as data_nascimento
from aluno
where data_nascimento is not null
 
02 - Mostre a pesquisa que retorna o resultado abaixo:
 
R: select resultado='o(a) aluno(a): '+nome_aluno+
   ' nasceu no dia '+convert(char(2),day(data_nascimento))+
   ' do mês de '+
   case month(data_nascimento)
      when 1 then 'janeiro'
      when 2 then 'feveiro'
      when 3 then 'março'
      when 4 then 'abril'
      when 5 then 'maio'
      when 6 then 'junho'
      when 7 then 'julho'
      when 8 then 'agosto'
      when 9 then 'setembro'
      when 10 then 'outubro'
      when 11 then 'novembro'
      when 12 then 'dezembro'
   end+' de '+convert(char(4),year(data_nascimento))
from aluno
where data_nascimento is not null
 
03 - Mostre a pesquisa que retorna o resultado abaixo:
R: select top 10 resultado=
       'o(a) aluno(a): '+a.nome_aluno+
       ' obteve nota = '+convert(char(4),m.nota)+
       ' na disciplina '+d.nome+
       ' a média geral foi '+(select convert(nvarchar(14),convert(numeric(4,2),avg(m2.nota))) from matricula m2 where m2.cod_disciplina=m.cod_disciplina)
from aluno a inner join
     matricula m on m.cod_aluno=a.cod_aluno inner join
     disciplina d on d.codigo_disciplina=m.cod_disciplina
where m.nota is not null
order by d.nome, a.nome_aluno
 
04 - Mostre a pesquisa que retorna o resultado abaixo:
R: select top 10 resultado=
       'o(a) aluno(a): '+a.nome_aluno+
       ' obteve nota = '+convert(char(4),m.nota)+
       ' na disciplina '+d.nome+
       ', estando '+case m.situacao
                                   when 'nok' then 'reprovado'
                                   when 'ok' then 'aprovado'
                            end
from aluno a inner join
     matricula m on m.cod_aluno=a.cod_aluno inner join
     disciplina d on d.codigo_disciplina=m.cod_disciplina
where m.nota is not null
  and m.situacao is not null
order by d.nome, a.nome_aluno
 
05 - Mostre a pesquisa que retorna o resultado abaixo:
R: select distinct resultado='os alunos do(a) professor(a) '+p.nome_professor+
' obtiveram média = '+
(select convert(nvarchar(14),convert(numeric(4,2),avg(m2.nota)))
 from matricula m2
 where m2.cod_disciplina=m.cod_disciplina)
from matricula m inner join
     disciplina d on d.codigo_disciplina=m.cod_disciplina inner join
     professor p on p.cod_professor=d.cod_prof
order by resultado
 
06 - Mostre a pesquisa que retorna o resultado abaixo:
R: select resultado='existem '+(select convert(char(4),count(*))
                             from matricula m, aluno a
                             where a.cod_aluno=m.cod_aluno)+
       'alunos matriculados. a média geral é '+(select convert(char(4),convert(numeric(4,2),avg(m.nota)))
                                                from matricula m, aluno a
                                                where a.cod_aluno=m.cod_aluno)+
       ' e a soma de todas as notas é '+(select convert(char(5),convert(numeric(4,2),sum(m.nota)))
                                         from matricula m, aluno a
                                         where a.cod_aluno=m.cod_aluno)
 
07 - Mostre a pesquisa que retorna o resultado abaixo:
R: select distinct resultado='na disciplina '+d.nome+
                 ' a maior nota foi '+(select convert(char(5),convert(numeric(4,2),max(m2.nota))) from matricula m2 where m.cod_disciplina=m2.cod_disciplina)+
                         ' a menor nota foi '+(select convert(char(5),convert(numeric(4,2),min(m2.nota))) from matricula m2 where m.cod_disciplina=m2.cod_disciplina)+
                         ' a média foi '+(select convert(char(5),convert(numeric(4,2),avg(m2.nota))) from matricula m2 where m.cod_disciplina=m2.cod_disciplina)
from matricula m inner join
     disciplina d on d.codigo_disciplina=m.cod_disciplina    
order by resultado
 
 
Funções de Manipulação de Dados Character
 
01 - Mostre a pesquisa que retorna o resultado abaixo:
R: select top 10 resultado=substring(nome_aluno,1,4) from aluno

02 - Mostre as letras do nome do aluno anteriores à letra ‘s’. Exemplo: Andressa à Resultado=’Andre’
R: select distinct resultado=substring(nome_aluno,1,
patindex('%s%',nome_aluno)-1)
from aluno
where patindex('%s%',nome_aluno)>0

03 - Mostre a pesquisa que retorna o resultado abaixo:
R: select resultado=substring(nome,1,patindex('% %',nome)) from disciplina

04 - Mostre a pesquisa que retorna o resultado abaixo:
R: select resultado=reverse(nome) from disciplina

05 - Mostre as notas obtidas pelos alunos de forma distinta, onde o formato seja xx.xx. Exemplo: 8.00 à Resultado: 08.00  10.00 à Resultado: 10.00
R: select distinct resultado=replicate('0',5-len(nota))+convert(varchar(5),nota) from matricula where nota is not null

06 - Mostre a pesquisa que retorna o resultado abaixo:
R: select codaluno=replicate('0',5-len(cod_aluno))+convert(varchar(5),cod_aluno), nome_aluno, data=convert(char,data_nascimento,103) from aluno where data_nascimento is not null

07 - Usando a função soundex, mostre o nome do aluno que se assemelha foneticamente a 'GEOVANI'.
R: select * from aluno where soundex(nome_aluno)=soundex('geovani')