Apostila 3
Histórico de revisões Data Versão Descrição Autor 30/09/2011 1.0 Criação da primeira versão HEngholmJr
CONTEÚDO Exclusão de registros Consultas por Dados de Resumo Group by / Having Funções agregadas Apelidos para tabelas Junções de tabelas Joins Subconsultas e Listas de valores Utilização de valores default e de regras Tabelas temporárias Gatilhos Stored procedures Tratamento de erros Backup e Restore de banco de dados
EXCLUSÃO DE REGISTROS O comando DELETE exclui permanentemente uma ou mais linhas de uma tabela, baseado em alguma condição. Sintaxe DELETE FROM nome_tabela WHERE condicao Onde: nome_tabela é o nome da tabela que deseja excluir os dados. condicao é condição para selecionar as dados d que deseja excluir. Por exemplo, para excluir o resumo operacional cuja chave primária é 27 da tabela tbresumosoperacionais, execute o seguinte comando no banco de dados d Exemplo: delete from tbresumosoperacionais where coresumooperacional = 27 O comando delete from tbresumosoperacionais apagaria todos os g registros da tabela.
EXCLUSÃO DE REGISTROS Observações A exclusão não poderá ser desfeita. Em qual caso o SGBD não permitiria estas exclusões???
DADOS DE RESUMO GROUP BY E HAVING Forma geral do GROUP BY e HAVING SELECT lista_de_colunas FROM lista_de_tabelas tabelas WHERE condições GROUP BY lista_de_expressões HAVING condições Cláusula GROUP BY: Organiza as linhas de resultado em grupos de acordo com os valores das expressões informadas. Permite utilizar funções agregadas, que calculam valores baseado nas linhas de um grupo e geram valores de resumo. Cláusula HAVING (opcional): seleciona os grupos de acordo com os resultados. O resultado do SELECT...GROUP BY... tem uma linha para cada grupo, que pode conter valores de resumo (somatório, média, contagem etc.) calculados dentro do grupo.
EXEMPLOS GROUP BY E HAVING Retornando a quantidade de registros da tabela tbcomprovantevenda select count(*) as totalregistros from tbcomprovantevenda Retornando a quantidade de registros da tabela por Resumo Operacional, agrupadas por coresumooperacional select coresumooperacional, COUNT(*)as totalregistros from dbo.tbcomprovantevenda group by coresumooperacional Retornando a quantidade de registros da tabela por Resumo Operacional, agrupadas por coresumooperacional com total >= 3 select coresumooperacional, COUNT(*)as totalregistros from dbo.tbcomprovantevenda group by coresumooperacional having COUNT(*) >= 3 Prática: Implemente e execute os SQL com group by apresentados
SELECIONANDO N OCORRÊNCIAS DE UMA TABELA SELECT TOP 1000 [coresumooperacional],[dataregistro],[coestabelecimentocomercial] FROM [bdprocessadoracartao].[dbo].[tbresumosoperacionais]
Funções agregadas Além da função COUNT, existem outras funções agregadas que podem ser usadas para fazer operações sobre os elementos do grupo: AVG(expr): Calcula o valor médio da expressão expr dentro do grupo. A expressão pode ser um nome de coluna ou calculada a partir de colunas e/ou constantes. Exemplo: AVG (salario*1.1) COUNT(expr): p Conta quantos valores existem da expressão dada dentro do grupo (se expr for NULL para uma linha, a linha não é incluída na contagem). COUNT(*): Conta quantas linhas existem dentro do grupo. MAX(expr): Retorna o máximo valor de expr dentro do grupo. MIN(expr) : Retorna o mínimo valor de expr dentro do grupo. SUM(expr) : Retorna o somatório da expressão dentro do grupo.
Funções agregadas - Exemplos Exemplos select coresumooperacional, AVG(valorItemVenda) as valormedio from dbo.tbcomprovantevenda group by coresumooperacional select coresumooperacional, COUNT(*) as totalregistro, AVG(valorItemVenda) as valormedio, MAX(valorItemVenda) as valormaximo, MIN(valorItemVenda) It as valorminimo, i SUM(valorItemVenda) as somavalores Vl from dbo.tbcomprovantevenda group by coresumooperacional Prática: Implemente e execute os SQL apresentados.
A cláusula Having Após feito o agrupamento, pode-se usar a cláusula HAVING para selecionar quais os grupos a serem incluídos no resultado. Por exemplo, para selecionar os resumos operacionais com valor médio de comprovante de venda maior do que R$ 1.000,00 podemos utilizar o SQL abaixo: select coresumooperacional, COUNT(*) as totalregistro, AVG(valorItemVenda) as valormedio, MAX(valorItemVenda) as valormaximo, MIN(valorItemVenda) as valorminimo, SUM(valorItemVenda) as somavalores from dbo.tbcomprovantevenda group by coresumooperacional having AVG(valorItemVenda) > 1000 As cláusulas WHERE e HAVING são semelhantes. Mas WHERE seleciona as linhas da tabela que irão participar da geração do resultado. Essas linhas serão agrupadas e depois HAVING é aplicado ao resultado de cada grupo, para saber quais grupos vão aparecer no resultado. Prática: Implemente consulta que retorne todos os resumos operacionais que possuem mais que 2 comprovantes de venda.
Apelidos para tabelas Para simplificar a qualificação de colunas, pode-se usar um apelido [alias] de tabela, um nome colocado imediatamente após o nome da tabela, na lista do FROM. Esse nome representa a tabela nas qualificações. select * from tbcomprovantevenda cv, tbresumosoperacionais ro, tbestabelecimentoscomerciaist b t i i ec where cv.coresumooperacional = ro.coresumooperacional and ro.coestabelecimentocomercial = ec.coestabelecimentocomercial and ro.coestabelecimentocomercial = 14 Prática: implemente a consulta que retorne os seguintes campos: razaosocial, dataregistro, descrição da bandeira utilizando apelido para as tabelas envolvidas no select.
Junções de tabelas O SQL Server aceita duas sintaxes diferentes para junção de tabelas, autilizando o sinal de = e a inner join. Na inner join, a condição de junção é especificada com a palavra ON Este tipo de junção conecta as duas tabelas e retorna apenas as linhas que satisfazem a condição de junção. Junção interior (Inner join) Este tipo de junção conecta as duas tabelas e retorna apenas as linhas que satisfazem a condição de junção. select dataregistro, descricaobandeira, numeroparcelas from dbo.tbresumosoperacionais inner join dbo.tbbandeirascartaocredito on dbo tbresumosoperacionais cobandeira = on dbo.tbresumosoperacionais.cobandeira dbo.tbbandeirascartaocredito.cobandeira
Junções de tabelas Exemplo de junção com mais de 2 tabelas select dataregistro, descricaobandeira, numeroparcelas, razaosocial from dbo.tbresumosoperacionais ro inner join dbo.tbbandeirascartaocredito bcc on ro.cobandeira = bcc.cobandeira inner join dbo.tbestabelecimentoscomerciais ec on ro.coestabelecimentocomercial Etbl tc il= ec.coestabelecimentocomercial Etbl tc il Prática: Implemente e execute os SQL de join apresentados
Junção exterior Uma junção exterior [outer join] mostra todas as linhas de uma tabela, mesmo quando elas não satisfazem a condição de junção. select coresumooperacional, dataregistro, descricaobandeira, numeroparcelas from dbo.tbresumosoperacionais left outer join dbo.tbbandeirascartaocredito on dbo.tbresumosoperacionais.cobandeira = dbo.tbbandeirascartaocredito.cobandeira Se é usado LEFT OUTER JOIN indica que todas as linhas da tabela à esquerda Se é usado LEFT OUTER JOIN indica que todas as linhas da tabela à esquerda (no caso, tbresumosoperacionais) são incluídas no resultado.
Junção exterior Se fosse usado RIGHT OUTER JOIN, a tabela à direita tbbandeirascartaocredito mostraria todas as linhas e a tabela à esquerda, apenas as relacionadas. select coresumooperacional, dataregistro, descricaobandeira, numeroparcelas from dbo.tbresumosoperacionais RIGHT outer join dbo.tbbandeirascartaocredito on dbo.tbresumosoperacionais.cobandeira = dbo.tbbandeirascartaocredito.cobandeira
Subconsulta Uma sub-consulta [subquery] é uma consulta SELECT aninhada dentro de outro comando SQL. Ela pode retornar um valor só ou uma lista de valores para ser usada numa comparação. ação Observe o calculo do percentual de item dentro do RO de código 27 mostrado abaixo. 100*(valorItemVenda*1.0/ (select sum(valoritemvenda) from tbcomprovantevenda where coresumooperacional = 27)) Prática: Digite, analise e teste o SQL abaixo select descricaoitemvenda as 'Descrição', quantidadeitemvenda, valoritemvenda, round((.96*valoritemvenda), 2) as 'Valor a receber', 100*(valorItemVenda*1.0/ 1.0/ (select sum(valoritemvenda) from tbcomprovantevenda where coresumooperacional = 27)) as 'Percentual do RO' from dbo.tbcomprovantevenda where coresumooperacional = 27 order by 'Valor a receber' desc
SUBCONSULTAS COM OPERADORES Uma sub-consulta pode ser inserida nos resultados, como acima, ou pode ser usada numa expressão WHERE, com um operador de comparação, como =, <, >, <=, >= ou <>. Nesse caso ela deve retornar apenas um valor. Esse valor é substituído na consulta principal no momento da execução.
Práticas Execução SQL de consulta Consultas simples de campos de tabelas Select * from tbcomprovantevenda select descricaoitemvenda, valoritemvenda from tbcomprovantevenda Consulta com ordenação por determinado campo select descricaoitemvenda, valoritemvenda from tbcomprovantevenda order by descricaoitemvenda select descricaoitemvenda, valoritemvenda, valoritemvenda*.9 from tbcomprovantevenda order by descricaoitemvenda Consulta de campo calculado select descricaoitemvenda as Item, valoritemvenda as Valor, valoritemvenda*.9 as valorcomdesconto from tbcomprovantevenda order by descricaoitemvenda select descricaoitemvenda as Item, valoritemvenda as Valor, valoritemvenda*.9 as 'Valor Com Desconto'from tbcomprovantevenda order by descricaoitemvenda
LISTAS DE VALORES Uma sub-consulta pode retornar uma lista de valores e essa lista de valores pode ser usada em comparações com o operador IN. Exemplos: i - SQL que retorna a descrição das bandeiras que foram utilizadas nas compras por cartões de crédito, utilizando a empresa operadora de cartões de crédito. select descricaobandeira from dbo.tbbandeirascartaocredito where cobandeira in (select distinct cobandeira from dbo.tbresumosoperacionais) ii - SQL que retorna a descrição das bandeiras que não foram utilizadas nas compras por cartões de crédito, utilizando a empresa operadora de cartões de crédito. select descricaobandeira from dbo.tbbandeirascartaocredito where cobandeira not in (select distinct cobandeira from dbo.tbresumosoperacionais)
PRÁTICA Insira na tabela tbbandeirascartaocredito a bandeira ELO Execute os SQL apresentados no slide anterior
DESABILITANDO IDENTITY Pode-se desativar temporariamente a propriedade IDENTITY, para inserir valores explicitamente numa coluna com IDENTITY. Pode ser necessário que você insira i valores explicitamente it t em tabelas que têm itens deletados com frequência. Inserir valores explicitamente na coluna com IDENTITY lhe permite preencher espaços vazios deixados na tabela. Para desativar a geração automática de valores, use: set identity_insert nome_da_tabela on Para voltar ao funcionamento normal, use: set identity_insert nome_da_tabela off
USANDO DEFAULTS E REGRAS Um default é um valor que é usado para colunas quando seus valores não são explicitamente informados. Um default pode ser criado como um objeto à parte ou como restrição de uma coluna, como veremos mais tarde. Uma regra é uma condição que é verificada quando dados são inseridos numa tabela. Ela também pode ser criado como um objeto à parte ou como uma restrição CHECK, como veremos. ALTER TABLE [ ONLY ] tabela [ * ] ALTER [ COLUMN ] coluna { SET DEFAULT valor DROP DEFAULT }
PRÁTICA Altere no SQL Server Mng Studio a tabela tbresumosoperacionais para que possua os valores default abaixo: Campo flagstatus: valor zero Campo dataregistro: valor data/hora da máquina através da função getdate()
CRIANDO E UTILIZANDO UMA REGRA Implemente a consulta que retorna a consulta DETALHE POR RO abaixo. Uma regra verifica o valor de uma coluna para saber se esse valor será aceito ou não. Se um valor inserido com INSERT ou atualizado com UPDATE não satisfaz a regra, ocorre um erro e a operação é cancelada. Uma regra contém uma condição qualquer (semelhante a uma cláusula WHERE) que tem um parâmetro a ser verificado. Esse parâmetro é substituído pelo valor da coluna no momento de execução da regra. Exemplo de criação com alter table: ALTER TABLE [dbo].[tbresumosoperacionais] WITH CHECK ADD CONSTRAINT [CK_tbResumosOperacionais] CHECK (([flagstatus]=(1) OR [flagstatus]=(0))) GO
PRÁTICA Crie utilizando o SQL Server Mng Studio a regra de inserção 0 ou 1 para o campo flagstatus. Veja as imagens a seguir. Em seguida, tente inserir um registro na tabela que possua valor diferente de 0 ou 1 na tabela para ver o resultado da inserção.
GATILHOS - TRIGGERS Um gatilho [trigger] é um tipo de procedimento armazenado, que é executado automaticamente quando ocorre algum tipo de alteração numa tabela. Gatilhos "disparam" a quando ocorre uma operação INSERT, UPDATE ou DELETE numa tabela. a Geralmente gatilhos são usados para reforçar restrições de integridade que não podem ser tratadas pelos recursos mais simples, como regras, defaults, restrições, a opção NOT NULL etc. Um gatilho também pode ser usado para calcular e armazenar valores automaticamente em outra tabela. Poderíamos utilizar um gatilho para quando for excluída um resumo operacional, todos os itens relacionados serão excluídos automaticamente ti t da tabela de comprovantes de venda. Por que não funcionaria neste caso???
CRIANDO GATILHOS Gatilhos são sempre criados vinculados a uma determinada tabela. Se a tabela for excluída, todos os gatilhos dela são excluídos como conseqüência. Ao criar um gatilho, você pode especificar qual(is) a(s) operação(ões) em que ele será acionado: INSERT, UPDATE ou DELETE. create trigger ExclusaoRO on DBO.tbResumosOperacionais AFTER delete --,UPDATE, DELETE as -- excluir todos os itens relacionados -- (mesmo coresumooperacional que deleted) delete from tbcomprovantevenda where coresumooperacional in (select coresumooperacional from deleted)
PRÁTICA Crie o gatilho acima Execute o SQL select * from dbo.tbcomprovantevenda e selecione algum coresumooperacional Tente apagar o registro que possui este valor como PK na tabela tbresumosoperacionais delete from tbresumosoperacionais where coresumooperacional = 27 Tente descobrir por que o banco de dados não deixou fazer a exclusão e execução do gatinho
PROCEDIMENTO ARMAZENADO Um procedimento armazenado [stored procedure] é uma seqüência de comandos da linguagem Transact-SQL, compilados e armazenados num banco de dados. d Os procedimentos armazenados do sistema [system stored procedures] são fornecidos pelo SQL Server, armazenados no banco de dados master e automatizam várias tarefas comuns de gerenciamento. Uma stored procedure pode receber parâmetros, retornar result set ou valor, executar qualquer tipo de SQL. Prática: Na página "Query" do SQL Server digite sp_databases que é uma SP do sistema
TRANSAÇÕES NO SQL SERVER Definição de transação Unidade lógica de processamento que tem por objetivo preservar a integridade e a consistência dos dados. A sintaxe básica de uma transação é: Begin Transaction --Corpo de comando Commit ou Rollback Onde Begin Transaction: Tag inicial i i para o inicio i i de uma transação. --Corpo de comando: Conjunto de comando a serem executados dentro de uma transação. Commit ou Rollback: Comandos que finalizam a transação onde o commit confirma o conjunto de comandos e o rollback k desfaz todo o processo executado pelo corpo de comandos caso tenha ocorrido algum evento contrario ao desejado. Podemos identificar erros através de estrutura try-catch ou através da chamada de @@ERROR.
TRATAMENTO DE ERROS SQL SERVER @@ERROR Chamada de @@ERROR : Função que por padrão recebe o valor 0 (zero) caso não ocorra nem um erro, assumindo o valor 1 (um) caso contrário. 1. Exemplo @@ERROR: BEGIN TRANSACTION UPDATE FROM TbContas SET NuSaldo= 10.000 WHERE NuSaldo < 50 IF @@ERROR = 0 COMMIT ELSE ROLLBACK END
TRATAMENTO DE ERROS SQL SERVER TRY CATCH Em linguagens de programação como C# e Java, é comum o uso do bloco TRY-CATCH para tratar as exceções lançadas durante a execução das aplicações. Ao implementar Stored Procedures, Funções e Ti Triggers, ou mesmo batches mais complexos, pode ser necessário tratar os possíveis erros ocorridos nos comandos. Até a versão 2000 do SQL Server, era necessário utilizar a função de sistema @@ERROR após cada um dos comando executado, pois o valor de retorno dessa função é reiniciao i i a cada comando executado. As versões 2005 e 2008 do SQL Server permitem implementar o tratamento de erros através do bloco TRY-CATCH, de maneira semelhante às linguagens de programação convencionais. i Este bloco é formado por dois sub-blocos: TRY - contém os comandos necessários para executar a tarefa desejada CATCH - contém os comandos para tratamento de possíveis erros ocorridos no bloco TRY Quando um erro ocorre no dentro do bloco TRY a execução é desviada para o bloco CATCH, o que permite continuar a execução do script ou interrompê-lo, de acordo com as necessidades do usuário e gravidade do erro gerado.
TRATAMENTO DE ERROS SQL SERVER TRY CATCH Sintaxe A sintaxe definida para este bloco de comandos é a seguinte BEGIN TRY [comandos SQL para execução de uma tarefa] END TRY BEGIN CATCH [comandos SQL para tratamento do erro] END CATCH Exemplo -- Criando tabela para teste CREATE TABLE #teste (id int) -- Adicionando restrição à tabela. -- Somente IDs menores do que 10 serão aceitos ALTER TABLE #teste ADD CONSTRAINT chkid CHECK (id < 10) -- Executando a tarefa em transação BEGIN TRANSACTION BEGIN TRY INSERT INTO #teste VALUES (5) INSERT INTO #teste VALUES (2) INSERT INTO #teste VALUES (13) -- Inserção de ID inválido COMMIT TRANSACTION -- Efetivando alterações na base END TRY BEGIN CATCH ROLLBACK TRANSACTION -- Desfazendo as alterações na base END CATCH
PRÁTICA - DESAFIO Implementar as alterações definidas em amarelo no documento Projeto Processadora Cartões de Crédito - Dicionário de dados.xlsx Passos a serem executados Criar nova tabela tbcartoesdecredito com PK em cocartaocredito Adicionar com comando SQL FK em tbcartoesdecredito no campo cobandeira Inserir campo cocartaocredito na tabela TBResumosOperacionais como FK Observações Para inserir nova coluna a tabela não pode haver registros nela. Para apagar os registros desta tabela, qual condição deve ser satisfeita? Excluir campo cobandeira na tabela TBResumosOperacionais
PRÁTICA - SOLUÇÃO Implementar stored procedure para realizar as alterações na tabela. Passos Criar a nova tabela tbcartoesdecredito Armazenar em tabelas temporárias, os dados das tabelas tbcomprovantevenda e TBResumosOperacionais. Não definir nestas tabelas temporárias campo IDENTITY. Apagar os dados das tabelas tbcomprovantevenda e TBResumosOperacionais Realizar as alterações na tabela TBResumosOperacionais Desligar as chaves primárias das tabelas SET IDENTITY_INSERT tbcomprovantevenda ON Copiar os dados das tabelas temporárias para as tabelas tbcomprovantevenda e TBResumosOperacionais Ligar as chaves primárias das tabelas SET IDENTITY_INSERT tbcomprovantevenda OFF
BACKUP DE BANCO DE DADOS Realizar backup de banco de dados no SQL Server é tarefa extremamente simples. Para realizar backup selecionar o banco de dados desejado com o botão direito do mouse e selecionar a opção backup conforme imagem abaixo e, se desejado, especificar outro local diferente do sugerido para armazenar o backup e confirmar a operação.
RESTORE DE BANCO DE DADOS Da mesma maneira, realizar restore de banco de dados no SQL Server é tarefa extremamente simples. Para realizar restore selecionar o banco de dados desejado com o botão direito do mouse e selecionar a opção restore conforme imagem abaixo, selecionando em seguida o banco de dados que se deseja realizar a operação de restore.