COMANDOS SQL SERVER
COMANDOS DCL: Dá permissões aos Usuário
GRANT: dá permissão a um usuário
REVOKE: Retira permissões de um usuário
Mostrar só o ano: SELECT CONVERT(VARCHAR(4), SYSDATETIME()
SGBDR : Sistema gerenciador de Banco de Dados Relacional
Unicode: é a padronização de todos os caracrteres de todas linguagem do mundo
para serem entendidas pelos bancod e dados:
Atenção: todos os dados do tipo de formato unicode devem obrigatoriamente serem
importados para o tipo de campo "nvarchar", como é no caso do excel. Tente definir os
campos de destinos do tipo nvarchar.
ASCII, UNICODE e oTruque UTF-8: um texto em UTF-8 é simples: ele é completamente em
ASCII e, quando precisamos de um caractere do Unicode, usamos um caracter especial, que
indica "atenção, o seguinte caractere é em Unicode". Por exemplo, para o texto "Bienvenue
chez Sébastien"(em francês), apenas o "é" não faz parte do código ASCII. Então,
escrevemos em UTF-8: De qua
Restaurar Leiaute, Janelas do SQL SERVER: Windows / Reset Layout
Criar mecanismo de BKP Automatico: SERVIDOR/Management/Maitenece Plans / Botão
Direito: New Maintecenece Plan.
Copiar: Copiando um pedaço de Texto: --Consulta por CNPJ
select * from EFD_NOTA_FISCAL Where SUBSTRING(ID_CONTRIBUINTE, 1, 14) =
'14928557000363'
DICIONARIO
Must: deve
Tier: camada
Imployer: implantar
VER TODA A CONFIGURAÇÇÃO DO SQL SERVER:
sp_configure
Mostra apenas configurações que começam com o termoq eu está entre as apas:
sp_configure ’show adv’
CRIANDO BASE DE DADOS
Create dataBase Nome_Base de dados.
Criar BKP de Tabela (Duplica) uma tabela
SELECT * INTO EVENTOS_BKP FROM EVENTOS
SQL para não trazer dados em branco: usar where e AND no lugar de OR
select CNPJ_CPF from cci_CAp where CNPJ_CPF bit<> '' AND CNPJ_CPF is not null
BKP DA BASE DADOS
Create dataBase Nome_Base de dados.
CRIAR UMA TABELA
SQL CONSTRAINTS - SÃO RESTRINÇÕES
Principais:
NOT NULL: a coluna não aceitará valor nulos. O campo sempre
deverá ter um valor. Não pode inserir e nem atualizar. A omissão
dessa informação permite entradas nulas no campo.
UNIQUE: é a registro que não vai se repetir. Essa linha será
única no banco de dados. ()
PRIMARY KEY: identifica registro unico na tabela. Um valor
único que nunca se repete. Automaticamente possui a Restrição
unique definida. Ex: de Tabela/Campo CPF. Não pode ter valor
NULL.
FOREIGN KEY: é um campo com chave primaria, que aponta para
chave primária da outra tabela.
CHECK: restringe os valores que é para ser colocado. Somente
Texto(matriz de texto) ou somente numero(1 a 10)
DEFAULT:insere valor padrão. Se nenhum outro dado for colocado
no campo ela já tem valor padrão.
IDENTITY(1,1): numero inicial e o incremento dele: significa
que o campo é criado como auto incremento: código Tnt Primary
KEY IDENTITY(1,1)
--INDETITY Com incremento de 3 a partir do 10
insert into outros_livros values('Livro3')
select * from OUTROS_LIVROS
SP_Help TBL_AUTORES: traz todos os dados da tabela
Chave Primaria:
Clicar no campo Codigo (Intero) eclicar na Cave na barrade menu. Não pode permitir Nulo
(Botão sireito e marcar como Chave Primeira)
Deve ser auto incremente: trocar nas propriedades: Indety Specification
CREATE TABLE CLIENTE (
ID VARCHAR(4) NOT NULL,
NOME VARCHAR(40) NOT NULL,
TELEFONE VARCHAR(10) NOT NULL,
VALOR DECIMAL(6,2) NOT NULL
);
Com chave primaria ????????????????:
CREATE TABLE CLIENTE(
CODIGO int not null,
NOME varchar(30),
TELEFONE varchar(15),
EMAIL varchar(30)
);
Site com os exemplos
http://www.devmedia.com.br/conheca-alguns-comandos-do-sql-server/1334
BKP DE TABELA
Criar Copia BKP de Tabela (Duplicar) uma tabele
SELECT * INTO EVENTOS_BKP FROM EVENTOS
Criar BKP de Tabela (Duplicar) uma tabela
SELECT * INTO LIVRO_3 FROM TBL_LIVROS where ID_LIVRO < 105
Copiar apenas campos Específicos
SELECT ID_AUTOR, NOME INTO LIVRO_BKP FROM TBL_LIVROS
ALTERAR UMA TABELA
Alterando uma tabela adicionando uma nova coluna: (sem virgulas)
ALTER TABLE CLIENTE ADD EMAIL_2 VARCHAR(20)
ALTER TABLE CLIENTE ADD EMAIL_3 VARCHAR(20) not null
ALTER TABLE OUTROS_LIVROS alter column [Codigo] int
Alterando uma tabela modificando uma coluna:
alter table CLIENTE alter column [NOME] varchar(210) not null
Deletando uma Coluna:
ALTER TABLE CLIENTE DROP COLUMN EMAIL
Alterar nome da Coluna da Tabela:
EXEC sp_rename 'CARTAO_2018_UNIFICADOS.[CPF CNPJ CONTRIBUINTE]', 'CNPJ',
'COLUMN'
DELETAR TABELA E LINHAS
Apagando uma Tabela:
DROP TABLE TESTE;
Apagando os dados de uma tabela retornando-a ao estado de origem:
Somente apaga toda a Tabela. Não apaga por filtro. Código mais leve
TRUNCATE TABLE CLIENTE;
OBS: se a tabela tiver relacionamentos você não poderá apagá-la.
Primeiro tem que excluir os relacionamentos. Ex: não tem como apagar a
tabela Cliente onde estes mesmo clientes estão dentro da tabela
vendas.
Deletando dados:
DELETE FROM CLIENTE WHERE ID = '2006';
Deletando por topo/Qtde:
delete top (264000) from EVENTOS
Delete com parametros e conversão:
delete from prestadores Where SUBSTRING(CAST(DATA_INICIAL AS VARCHAR(8)), 1, 4) =
'2015'
INSERT INTO
INSERIDNO DADOS NA TABELA
Em Todas colunas Correspondentes:
INSERT INTO CLIENTE VALUES ('2006', 'Rodrigo2', '44662',102.95);
Jeito certo de inserir Valores: (com ponto separando a casa decimal)
insert into vendedor(CODIGO, NOME, COMISSAO) values(4, 'PEDRO2',
20.00)
Forma certa do sqlserver não colocar duas casas decimais a mais quando
se copia dados para dentro de uma campo tipo money
insert teste(valor) values('10,00') – Resultadfo: 1000,00
insert teste(valor) values('10.00') – Resultado: 10,00
select * from teste
Em Colunas Escolhidas:
INSERT INTO CLIENTE(NOME, TELEFONE) VALUES ('SERGIO', '3663');
Insert com select:
Isert Com tabelas idênticas:
insert into vendedor_externo select * from vendedor
Com parâmetros Select Where:
insert into VENDEDOR_EXTERNO(codigo, nome, perfil, comissao)
select codigo, nome, perfil, comissao from VENDEDOR
where CODIGO = 1
insert into VENDEDOR_EXTERNO(codigo, nome, perfil, comissao)
select codigo, nome, perfil, comissao from VENDEDOR
where COMISSAO >= 20.00
SubString: Inserindo parte de um campo em outro de outra tabela:
INSERT EVENTOS(RAIZ_CNPJ) select SUBSTRING(TODASCOLUNAS, 1, 8) from
EVENTOS_3
FUNÇÕES MATEMÁTICAS
Funções Agregadas
Todos é bom usar com parâmetros de filtros (Where, AND, OR)
Somar:
select SUM(Salario) from VENDEDOR
Maximo Valor:
Select MAX(Salario) from VENDEDOR
Minimo Valor:
Select MIN(salario) from vendedor
Media Valor:
Select AVG(Salario) from VENDEDOR
Quantidader (que tem valor. Não traz nulo):
Select COUNT(Codigo) from vendedor
Select COUNT(*) from vendedor
UPDATE – ATUALIZAR DADOS
Alterando dados: (OBS: Sempre colocar uma condição para atualizar)
UPDATE VENDEDOR SET Perfil = '3'
UPDATE VENDEDOR SET Perfil = '1' WHERE Comissao >= 20.00
Alterando dados:
UPDATE CLIENTE SET VALOR = 10 WHERE ID = '2006';
Update em mais de um campo:
UPDATE VENDEDOR SET PERFIL = '5', COMISSAO = 50.00 WHERE COMISSAO >=
20.00
UPDADTE X SELECT
Podemos combinar o comando SELECT com UPDATE. No exemplo a seguir, os
funcionários de menor salário receberão aumento de 10%.
UPDATE VENDEDOR
SET SALARIO = Salario * 1.1
WHERE SALARIO = (SELECT MIN(salario) FROM VENDEDOR)
Quem tem o maior salário perde 20% do Salario:
UPDATE VENDEDOR
SET SALARIO = salario - (salario / 100 * 20)
WHERE SALARIO = (SELECT MAX(salario) FROM VENDEDOR)
Update passando select como valor: o vendedor 2 terá o máximo salário também
UPDATE VENDEDOR
SET Salario = (SELECT MAX(Salario) FROM VENDEDOR)
WHERE CODIGO = 2
ORDER BY
select * from vendedor order by NOME asc
select * from vendedor order by NOME DESC
Order By com niveis de filtro
select * from EVENTOS order by RAIZ_CNPJ, DATA_ENTRADA asc
Order By com 2 ou mais niveis de filtros diferentes
Select * FROM RELATORIO_EMPRESAS_DO_CONTADOR_TEMPORARIO ORDER BY
SITUACAO_CADASTRAL ASC, VA DESC
GROUP BY
ENTENDIMENTO: mostra quantos elementos da esquerda tem dentro de
cada grupo que está à direita.
Também Traz vários campos, mesmo, se um deles é somado(SUM) ou
contado(Count).
OBS: Todos os campos que forem pesquisados: (Select
campo1, SUM(campo2), campo3 From Tabela) devem estar na
clausula (Group by campo1, campo2, campo3), inclusive
os somados ou contados): (Select campo1, SUM(campo2),
campo3 From Tabela) Group by campo1, campo2, campo3
--Exemplo Simples: soma a QTDE vendas por forma de pagamento(ou por
cliente). Ou a Qtde de Vendas Feita por um vendedor.
SELECT T.FORMA_PAGAMENTO, SUM(T.VALOR) AS "TOTAL" FROM TESTE T
Group by T.FORMA_PAGAMENTO
-- Mostra Alguns Campos e Conta todo Mundo Simples:
Select NF.CODIGO_PARTICIPANTE_COMPRADOR, COUNT(*) from EFD_PRESTADOR_TRANSPORTE_NOTA_FISCAL
AS NF
Group BY NF.CODIGO_PARTICIPANTE_COMPRADOR
--Qtde de Departamentos
select COUNT(Nome) from VENDEDOR
--Qtde de Departamentos cadastrados por vendedor
select COUNT(Departamento) from VENDEDOR
--Qtde de nomes Departamento Único, teria que ser a causa DISTINCT
select DISTINCT Departamento from VENDEDOR
--GROUP BY
-- Traz a Qtde de Vendedores por Departamento: o agrupamento foi feito
pela Coluna DEPARTAMENTO
SELECT COUNT (*) 'Vendedor por Departamento', Departamento FROM
VENDEDOR GROUP BY Departamento
SELECT COUNT(*) 'QTDE de Produtos' FROM PRODUTOS GROUP BY ESTOQUE
Qtde de Perfil Agrupado por vendedor
SELECT COUNT(*) 'QTDE de Vendedor em cada Perfil', PERFIL FROM
VENDEDOR GROUP BY PERFIL
Também Traz vários campos, mesmo, se um deles é somado(SUM) ou
contado(Count). E no group By coloca-se os campos
Select CNPJ_FILIAL, SUM(VALOR_POR_ATIVIDADE) from PGDASDFILIAL Group
by CNPJ_FILIAL, VALOR_POR_ATIVIDADE
Fechando uma compra: Usa Três tabelas. Seleciona todos produtos
comprados tabela externa, mostra o cliente que comprou chave
estrangeira, mostra o produto comprado que está em outra tabela, faz o
calculo da QTDE comprada vezes o valor do produto e filtra por valor
ou produto:
SELECT C.ID_CLIENTE, C.CLIENTE, P.PRODUTO, P.PRECO, COUNT(*) AS "QTDE", (COUNT(*)
* P.PRECO) AS "TOTAL", T.FORMA_PAGAMENTO,
CASE T.FORMA_PAGAMENTO
when 1 then 'Boleto'
when 2 then 'Cartão VISA'
when 3 then 'Cartão MASTERCARD'
when 4 then 'Dinheiro'
end as "TIPO PAGAMENTO" FROM TESTE T
JOIN
PRODUTO AS P
ON
P.CODIGO=T.CODIGO_PRODUTO
JOIN
CLIENTE AS C
ON
C.ID_CLIENTE=T.ID_CLIENTE
--Agrupando e Filtranto - AS comprar acima de um valor / Ou só quem comprou um
tipo deobjeto
Group by C.ID_CLIENTE, C.CLIENTE, P.PRODUTO, P.PRECO, T.FORMA_PAGAMENTO HAVING
(COUNT(*) * P.PRECO) >= '0.00'
Não Repetir Linhas:
SELECT DISTINCT(E.IE), SUM(E.VR_CONTABIL) FROM EFDGIA E where E.data_inicial
BETWEEN '20160101' AND '20161231'
Group by E.IE
HAVING
ENTENDIMENTO: dos resultados trazidos agrupados, ele permite colocar
critérios para mostrar. Esta cláusula nos permite informar critérios
de filtragem baseados nos valores das próprias totalizações geradas
para os grupos. Os critérios de filtragem da cláusula HAVING são
aplicados após os agrupamentos terem sido feitos. A cláusula HAVING
vem sempre após a cláusula GROUP BY e usa , em seus critérios,
expressões que aparecem no SELECT para gerar os totais dos grupos.
Veja um exemplo:
Traz a soma das vendas por forma de pagamento e com o critério(HAVING)
– Só as somas dos grupos que deram abaixo de 100
SELECT T.FORMA_PAGAMENTO, SUM(T.VALOR) AS "TOTAL" FROM TESTE T
Group by T.FORMA_PAGAMENTO HAVING SUM(T.VALOR) < '100.00'
Traz a soma de cada grupo, q QTDE de linhas que cada grupo tem:
SELECT COUNT(*), FORMA_PAGAMENTO, SUM(T.VALOR) AS "TOTAL" FROM TESTE T
Group by T.FORMA_PAGAMENTO HAVING SUM(T.VALOR) >= '000.00'
AS – SQL ALIAS
Alias: significa Pseudônimo
Renomeia-se a coluna para Exibição
SELECT RAZAO_SOCIAL_MATRIZ AS ”EMPRESA” FROM PGDASD
Não Precisa de Aspas para o novo nome:
SELECT RAZAO_SOCIAL_MATRIZ AS EMPRESA FROM PGDASD
Apelidar um tabela para usar os campos dela depois:
SELECT P.RAZAO_SOCIAL_MATRIZ FROM PGDASD AS P
CONCATENÇÃO
Concatenação de String e Campos
CONCATENÇÃO (+)
select * from vendedor where nome = 'ser' + 'gio'
É possível concatenar String usando-se o operador de concatenação +.
Serve também Trazer várias colunas Apenas em Uma
Sintaxe:
String1 | Coluna + String2 | Coluna
Mostrando concatenção só de String sem buscar no banco
select 'SERGIAO' + 'LISBOA'
Exemplo: varias colunas do banco em uma só
SELECT NOME_AUTOR + ' ' + SOBRE_NOME_AUTOR AS 'NOME COMPLETO' FROM
TBL_AUTORES
Concatenar String solta com o conteudo de uma coluna
select 'Eu gosto dos livros dos Autores com o Sobrenome SILVA.: ' +
NOME_AUTOR + ' ' + SOBRE_NOME_AUTOR AS 'NOME COMPLETO' FROM
TBL_AUTORES
Where SOBRE_NOME_AUTOR LIKE '%SILVA%'
SELECT
Traz todos os dados
SELECT * FROM VENDEDOR
Traz campos específicos:
SELECT Vendedor, Comissao FROM VENDDOR
Select com Where:
SELECT * FROM VENDEDOR WHERE Codigo = 5 (>, <, =, >=, <=)
Select com AND e OR : (Where é obrigatório)
SELECT * FROM VENDEDOR WHERE Codigo > 1 AND COMISSAO < 500
SELECT * FROM VENDEDOR WHERE Codigo > 1 OR COMISSAO > 500
Select TOP (usar as palavras reservadas antes do asterisco)
Traz os 10 primeiros Itens:
SELECT TOP 10 * FROM VENDEDOR
SELECT TOP 10 PERCENT * FROM VENDEDOR
IN: seleciona se estiver valor igual ao da lista
SELECT * FROM VENDEDOR WHERE CODIGO IN(1,2)
SELECT * FROM VENDEDOR WHERE CODIGO IN(select codigo from
VENDEDOR_EXTERNO)
NOT IN: Não seleciona se estiver na lista:
SELECT * FROM VENDEDOR WHERE CODIGO NOT IN(1, 5)
SELECT * FROM VENDEDOR WHERE CODIGO NOT IN(select codigo from
vendedor_externo where salario >= 2000)
EXISTS ou NOT EXISTS: Equivale ao IN ou NOT IN
SELECT * FROM VENDEDOR WHERE EXISTS
(SELECT * FROM VENDEDOR_EXTERNO
WHERE VENDEDOR.CODIGO = VENDEDOR_EXTERNO.CODIGO)
SELECT * FROM VENDEDOR WHERE NOT EXISTS
(SELECT * FROM VENDEDOR_EXTERNO
WHERE VENDEDOR.CODIGO = VENDEDOR_EXTERNO.CODIGO)
DISTINCT:
Não traz nenhuma linha repetida que seja idêntica a uma outra:
select DISTINCT * from vendedor
Por campos únicos (nem uma linha vai ser igual a outra linha)
select DISTINCT Nome, perfil from vendedor
select distinct CNPJ_FILIAL, RAZAO_SOCIAL_MATRIZ from PGDASDFILIAL
order by RAZAO_SOCIAL_MATRIZ ASC
Distinct com Count:
SELECT COUNT(DISTINCT CNPJ_FILIAL) AS 'QTDE EMPRESAS COM DECLARAÇÃO' FROM
PGDASDFILIAL
BETWEEN:
traz dados que estão dentro de um intervalo de valor
Por Numero:
SELECT * FROM VENDEDOR WHERE CODIGO BETWEEN 5 AND 10
Valores:
SELECT * FROM VENDEDOR WHERE SALARIO BETWEEN 500.00 AND 1500.00
Por Data:
SELECT * FROM TBL_LIVROS WHERE DATA_PUB BETWEEN '20130101' AND '20141231'
SELECT * FROM TBL_LIVROS WHERE DATA_PUB BETWEEN '2013-01-01' AND '2014-12- 31'
Com empressão Select:
SELECT * FROM VENDEDOR WHERE Salario BETWEEN (Select Max(Salario) FROM VENDEDOR)
AND 100000.00
Somente quem ganha até a Metade do Salário Máximo de Um Vendedor:
SELECT * FROM VENDEDOR WHERE Salario BETWEEN (Select Min(Salario) FROM VENDEDOR)
AND ((Select Max(Salario) FROM VENDEDOR) / 2)
LIKE COMPARAÇÃO – CONTÊM:
LIKE: contem: antes, depois e no meio
select * from vendedor where nome LIKE 'MA%'
select * from vendedor where nome LIKE '%IO'
select * from vendedor where nome LIKE '%ER%'
select * from vendedor where nome LIKE '%ER%O%' (várias partes)
Que o Inicio seja igual a uma das letras passadas:
select * from vendedor where nome LIKE '[AJR]%'
Inicie entre um intervalo: A J
select * from vendedor where nome LIKE '[A-J]%'
Que inicie em S e a segunda letra seja E ou I (Etc...)
select * from vendedor where nome LIKE 'S[EI]%'
Que inicie em S e a segunda letra esta dentro de um intervaldo passado
select * from vendedor where nome LIKE 'S[I-J]%'
Resultado: Silvana
SUBCCONSULTAS
A subonsultas (SubQuery) é uma declaração SQL embutida em uma consulta
externa.
A subConsulta fornece uma resposta à consulta externa na forma de um valor
escalar, lista de valores, ou conjunto de dados, equivalente a uma expressão, lista ou
tabela para consulta externa.
O Select Interno (subconsulta) deve ficar entre parênteses.
Tabela Derivada: é tabela que é gerada pela subconsulta.
Um tipo diferente de esubconsulta(Interno): select * from EVENTOS
where (data_saida = '00000000' AND SUBSTRING(DATA_ENTRADA, 1, 4) = '2016') OR
ESTADO = 'S' ORDER BY DATA_ENTRADA
Consulta Inicial sem as teclas apresentadas
SELECT CL.NOME_CLIENTE AS CLIENTE, PR.PRODUTO AS PRODUTO,
PR.PRECO_PRODUTO AS PREÇO, CO.QTDE AS QTDE,
PR.PRECO_PRODUTO * CO.QTDE AS TOTAL FROM CLIENTE AS CL
INNER JOIN COMPRA AS CO
ON CL.ID_CLIENTE = CO.ID_CLIENTE
INNER JOIN PRODUTOS AS PR
ON CO.ID_PRODUTO = PR.ID_PRODUTO
Ordenar por CLINTE e TOTAL de suas comprar
Errado: porque não está em uma função e agregação esta coluna
--GROUP BY CL.NOME_CLIENTE
É só passar esta consulta feita acima como fonte de dados para uma
outra consulta
Mas só os campos CLIENTE e TOTALs
SELECT CL.NOME_CLIENTE AS CLIENTE, PR.PRECO_PRODUTO * CO.QTDE AS TOTAL
FROM CLIENTE AS CL
INNER JOIN COMPRA AS CO
ON CL.ID_CLIENTE = CO.ID_CLIENTE
INNER JOIN PRODUTOS AS PR
ON CO.ID_PRODUTO = PR.ID_PRODUTO
(ESTUDAR MAIS ESTAS
SUBCOBSULTAS????????????????????)
Exemplo de fácil entendimento: fiz uma consulta dentro de outra
consulta montada. O que está sublinhado seria a tabela.
Select D.DATA_SAIDA FROM (SELECT DATA_SAIDA FROM EVENTOS) AS D WHERE D.DATA_SAIDA
= '20151231'
Mostrando o Total de Comprar por Cliente
Usando a Tabela Derivada
SELECT RESULTADO.CLIENTE, SUM(RESULTADO.TOTAL) AS TOTAL
FROM
(
SELECT CL.NOME_CLIENTE AS CLIENTE, PR.PRECO_PRODUTO * CO.QTDE AS TOTAL
FROM CLIENTE AS CL
INNER JOIN COMPRA AS CO
ON CL.ID_CLIENTE = CO.ID_CLIENTE
INNER JOIN PRODUTOS AS PR
ON CO.ID_PRODUTO = PR.ID_PRODUTO
)
AS RESULTADO --Nome da Tabela Deriva Criada
Agrupando por Nome e Ordenando por Total
GROUP BY RESULTADO.CLIENTE
ORDER BY TOTAL
CTE – SUBCCONSULTAS
COMMON TABLE EXPRESSION
Expressão de Tabela Comum
É uma variação sintática de uma consulta, similar a uma exibição VIEW.
O CTL deve ser criado antes da consulta principal.
UNION
Permite combinar duas ou mais declarações select. Cada declaração select
deve ter o mesmo numero de colunas, tipos de dados e ordem das colunas.(Melhor
usar o JOIN)
Traz uma linha abaixo da outra identica:
SELECT * FROM TBL_LIVROS
UNION
SELECT * FROM LIVROS_2
--Traz todos os que estão um em cada tabela. Deve ter ao menos um campo em
comum:
SELECT ID_AUTOR FROM TBL_LIVROS
UNION
SELECT ID_AUTOR FROM TBL_AUTORES
--UNION ALL: faz com que traga os campos repetidos que coincidem em Ambas as
Tabelas
SELECT ID_AUTOR FROM TBL_LIVROS
UNION ALL
SELECT ID_AUTOR FROM TBL_AUTORES
--Trazendo dois Campos: que coincidem, mas um em Cada Tabela (um em baixo do
outro)
SELECT ID_AUTOR, NOME FROM TBL_LIVROS
UNION
SELECT ID_AUTOR, NOME_AUTOR FROM TBL_AUTORES
SELECT COUNT(CNPJ_MATRIZ) AS CNPJ FROM PGDASD
UNION ALL
SELECT COUNT(CNPJ_FILIAL) AS PGDASDFILIAL FROM PGDASDFILIAL
--A coluna deve ter o mesmo nome e trará as duas tabelas no resultado de apenas
uma consulta
Select DISTINCT CNPJ_ESTABELECIMENTO from DEFIS_FILIAL_TRANSPORTE
UNION ALL
Select DISTINCT CNPJ_ESTABELECIMENTO from
JOIN
União de Tabelas
A palavra chave JOIN é usada para obter dados provenientes de duas ou
mais tabelas, baseado em um relacionamento entre colunas destas tabelas:
Cliente.IdCliente = Venda.IdCliente.
INNER JOIN: só retorna dados se ele encontrar pelo menos uma correspondência em ambas as
tabelas. Ver ponto de intersecção, conexão entre as tabelas.
OTHER JOIN: retorna os dados mesmo que NÃO houver nenhuma correspondência nas
tabelas. Ele divide-se em: LEFT JOIN, RIGHT JOIN e FULL JOIN.
INNER JOIN: tem correspondência
Seleciona quem tem o Mesmo ID (ON)
SELECT * FROM TBL_LIVROS INNER JOIN TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR
Só os nomes que Interessam
SELECT TBL_LIVROS.ID_AUTOR, TBL_LIVROS.NOME FROM TBL_LIVROS INNER JOIN
TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR
JOIN com Alias (Dando apelido pa as tabelas)
SELECT L.ID_AUTOR, L.NOME FROM TBL_LIVROS AS L INNER JOIN TBL_AUTORES
AS E
ON L.ID_AUTOR = E.ID_AUTOR
OTHER JOIN: quando não tem correspondência exata:
LEFT JOIN: retorna todas as linhas da tabela à esquerda, mesmo se não houver nenhuma
correspondência a tabela a direita.
RIGHT JOIN: retorna todas as linhas da tabela a direita, mesmo se não houver nenhuma
correspondência a tabela a esquerda.
FULL JOIN: retorna linhas quando houver uma correspondência em qualquer uma das tabelas.
É uma combinação de LEFT e RIGHT JOINS.
LEFT JOIN: traz todos os dados da tabela esquerda (primeira tabela),
mesmo se não tiver correspondência na tabela da direita (segunda
tabela
Casso tenha ela a interpretará como INNER JOIN normal
SELECT * FROM TBL_LIVROS
LEFT JOIN TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR
Apenas o item que não tem correspondência (Apenas livros que tem autor
- Que são todos)
SELECT * FROM TBL_LIVROS
LEFT JOIN TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR Where
TBL_AUTORES.ID_AUTOR IS NOT NULL
RIGHT JOINN: é exatamente o inverso do LEFT JOINN: trará todos os
dados da tabela a direita mesmo se não tiver correspondência com a
Tabela da Esquerda.
Caso haja correspondência, se comportará como INNER JOIN.
SELECT * FROM TBL_LIVROS
RIGHT JOIN TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR
Apenas Autor que já tenha um livro cadastrado
SELECT * FROM TBL_LIVROS
RIGHT JOIN TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR WHERE
TBL_LIVROS.ID_LIVRO IS NOT NULL
FULL JOINN: traz todos dados independente de ter ou não uma
correspondência. Pode-se usar a clausula Where
Vantagem: quem tem correspondência, intersecção ele mostra. É o caso
dos ID's - Pode-se usar parâmetros
SELECT * FROM TBL_AUTORES
FULL JOIN TBL_LIVROS
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR
FULL JOINN: excluindo correspondências (só autor que tem livro
cadastrado)
SELECT * FROM TBL_AUTORES
FULL JOIN TBL_LIVROS
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR where TBL_LIVROS.ID_AUTOR IS NOT
NULL
JUNTAR 3 OU MAIS TABELA:
SELECT C.ID_CLIENTE, C.CLIENTE, P.PRODUTO FROM TESTE AS T
JOIN
CLIENTE AS C
ON
C.ID_CLIENTE=T.ID_CLIENTE
JOIN
PRODUTO AS P
ON
P.CODIGO=T.CODIGO_PRODUTO
Sub-consultas SQL
Uma sub-consulta é uma instrução SELECT aninhada dentro de outra instrução SELECT, INSERT,
DELETE ou UPDATE. Veja abaixo alguns exemplos de sintaxe:
Comparação [ANY|SOME|ALL] (instrução sql)
Expressão [NOT] IN (instrução sql)
Expressão [NOT] EXISTS (instrução sql)
Os predicados ANY e SOME, sinônimos, são utilizados para recuperar registro na consulta
principal que satisfaçam a comparação com qualquer registro da sub-consulta.
WITH TIES
As vezes quando se faz select com TOP() ele não traz alguns
itens da lista principalmente se ele for repetido permitem. Esta
clausula resolve isto.
--Traz os três primeiros vendedores com os menores salários mas
despreza quem está repetido
select TOP(3) * from VENDEDOR
--ORDER BY é essencial
-- Traz Tres categorias, e também os itens repetidos que possam entrar
nesta categorias
select TOP(3) WITH TIES NOME, COMISSAO, SALARIO from VENDEDOR ORDER BY
SALARIO ASC
VIEWS
Qual o tempod e vida de uma view???
VIEW é uma tabela virtual baseada no conjunto de resultados de
uma consulta SQL.
Contêm linhas e colunas como uma tabela real, e pode receber
comandos como a declaração JOIN, WHERE e funções como uma tabela
normal.
Ela sempre mostra os resultados de dados Atualizados. O motor de
banco de dados recria os dados sempre que você consulta a visão. Dados
sempre atualizados.
Criando a View Com Slect Simples:
CREATE VIEW Teste_usuario
AS
SELECT * from usuario
Com Select mais Elaborado:
CREATE VIEW Vw_Livros_Autores
AS
SELECT TBL_LIVROS.LIVRO AS LIVRO, TBL_AUTORES.NOME_AUTOR AS AUTOR FROM TBL_LIVROS
INNER JOIN TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR
Utilizando a Exibição: com select Simples:
SELECT * FROM Vw_Livros_Autores
SELECT * FROM Vw_Livros_Autores where LIVRO LIKE '%1%'
Acrescentando mais uma coluna na VIEW:
ALTER VIEW Vw_Livros_Autores AS SELECT TBL_LIVROS.LIVRO AS LIVRO,
TBL_AUTORES.NOME_AUTOR AS AUTOR, TBL_LIVROS.PRECO_LIVRO AS PREÇO FROM TBL_LIVROS
INNER JOIN TBL_AUTORES
ON TBL_LIVROS.ID_AUTOR = TBL_AUTORES.ID_AUTOR
Agora mostra já a view com a coluna PREÇO_LIVRO:
SELECT * FROM Vw_Livros_Autores
Deletar uma VIEW
DROP VIEW Vw_Livros_Autores
--APESAR DA VIEW NÃO APARECER COMO UMA TABELA FISICA - É SÓ CONSULTAR,
TRABALHAR TODOS OS DADOS QUE FORAM JOGADOS PARA DENTRO DA VIEW. USAR
CONSULTAS SIMPLES E COMPLETAS
CHAVES ESTRANGEIRAS
Motivo de Usar: Segurança do Banco. Por exemplo, se um ID de um
cliente está em um pedido ele não pode ser deletado da tabela CLIENTE.
No máximo ser colocado como Inativo etc.. Integridade.
//Traz os dados da tabela Pedido e Cliente onde os ID dos Clientes se combinam.
select * from PEDIDO
JOIN
CLIENTE
ON
PEDIDO.IdCliente = CLIENTE.IdCliente
JOIN ANINHADOS (Traz o Nome dos Produtos)
select * from PEDIDO
JOIN
CLIENTE
ON
PEDIDO.IdCliente = CLIENTE.IdCliente
JOIN
PRODUTO
ON
PEDIDO.IdPedido = PRODUTO.IdProduto
EXECUTNADO UMA COMPRA – CHAVE ESTRANGEIRA
select
CLIENTE.IdCliente,
CLIENTE.NOME,
PEDIDO.IdPedido,
PRODUtO.PRODUTO,
PRODUTO.VALOR,
PEDIDO.QTDE_CAMPRADO,
(PEDIDO.QTDE_CAMPRADO * PRODUTO.VALOR ) AS 'VALOR'
from PEDIDO
JOIN
CLIENTE
ON PEDIDO.IdCliente = CLIENTE.IdCliente
JOIN
PRODUTO
ON PEDIDO.IdPedido = PRODUTO.IdProduto
CONVERSOES
CAST E CONVERT
Podemos converter expressões de um tipo de dados em outo no SQL
usando as funções: CAST e CONVERT
CAST
OBS: Para fazer a concatenação o outro elemento tem que ser
String
select 'Produto.: ' + Produto + ' Valor Prodturo.: ' + CAST(VALOR AS VARCHAR(20))
from PRODUTO
Erro por falta de Conversão:
select 'Produto.: ' + Produto + ' Valor Prodturo.: ' + VALOR from PRODUTO
(Erro ao converter tipo de dados varchar em numeric. )
Data - cast que Funcionou. Procurando somente o ano:
select * from PRESTADORES Where SUBSTRING(CAST(DATA_INICIAL AS VARCHAR(8)), 1, 4)
= '2015'
Cast que Funcionou:
select CAST(RAIZ_CNPJ as INT) from EVENTOS
String do mesmo tamanho para data:
SELECT CAST(RAIZ_CNPJ AS DATE) "Date" FROM EVENTOS
CONVERT
CONVERT (novo_tipo_de_dados, expressão, estilo), o estilo é
normalmente usado para trabalhar Float/Real
select 'Produto.: ' + Produto + ' Valor Prodturo.: ' + CONVERT(VARCHAR(20),
VALOR) from PRODUTO
CONVERT DATA: (Nosso Padrao ‘e o 103 – Frances/Britanico)
Convertendo data em String e Concatenado e Mostrando:
select 'DATA.:' + CONVERT(VARCHAR(18), DATA_ENTRADA) from EVENTOS
Data sem estilo
select 'DATA DACOMPRA.: ' + CONVERT(VARCHAR(18), DATA_COMPRA) from COMPRA
Data com Estilo
select 'DATA DACOMPRA.: ' + CONVERT(VARCHAR(18), DATA_COMPRA, 103) from COMPRA
Convertendo com Estilo de formato
select 'DATA.:' + CONVERT(VARCHAR(18), DATA_ENTRADA, 103) from EVENTOS
Saida: 01/01/2007
Outros que deram certo:
INSERT EVENTOS(DATA_ENTRADA) select CAST(SUBSTRING(TODAS, 9, 8) AS
DATE) "Date" FROM EVENTOS
Dois parâmetros:
INSERT EVENTOS(RAIZ_CNPJ, DATA_ENTRADA) select SUBSTRING(TODAS, 1, 8),
CAST(SUBSTRING(TODAS, 9, 8) AS DATE) "Date" FROM EVENTOS
Convertendo Money:
Select CONVERT(money, SUM(VALOR_SERVICO)) from PRESTADORES where IE = '130204250'
AND DATA_INICIAL BETWEEN '20130101' AND '20131231'
SELECT CONVERT(int, 14.85);
Result: 14 (result is truncated)
SELECT CONVERT(float, 14.85);
Result: 14.85 (result is not truncated)
SELECT CONVERT(varchar, 15.6);
Result: '15.6'
SELECT CONVERT(varchar(4), 15.6);
Result: '15.6'
SELECT CONVERT(float, '15.6');
Result: 15.6
DADTA – Convertendo String para Data
SELECT CONVERT(datetime, '2014-05-02');
Result: '2014-05-02 00:00:00.000'
SELECT CONVERT(varchar, '05/02/2014', 101);
Result: '05/02/2014'
CAMPOS CALCULADOS
USE TESTES
Um capo fica pré-definido para ser preenchido com um determinado Valor
CREATE TABLE PRODUTOS(
CODIGO INT,
NOME VARCHAR (50),
PRECO MONEY,
QTDE int,
TOTAL AS (PRECO * QTDE) -- Esta linha faz com que este campo seja
preenchido automaticamente.
)
Inserindo os dados (sem o total):
INSERT INTO PRODUTOS VALUES(1, 'MAÇÃ', 15.00, 2)
INSERT INTO PRODUTOS VALUES(2, 'PERA', 10.00, 2)
INSERT INTO PRODUTOS VALUES(3, 'UVA', 5.00, 5)
INSERT INTO PRODUTOS VALUES(4, 'MANGA', 7.00, 3)
INSERT INTO PRODUTOS VALUES(5, 'ABACAXI', 5, 2)
Mostrando:
SELECT * FROM PRODUTOS
INDICES DE BANCO DE DADOS
Permitem que as aplicações de banco de dados encontrem os dados
mais rapidamente, sem ter de ler tabela toda. O Usuário não vê o
índice. Dá muita performance ao banco.
OBS: criar índice apenas em tabela que receba muita consulta, pois ela
será toda indexada. Para o banco não ficar todo indexado e pesado.
Comando:
CREATE INDEX INDICE_CNPJ
ON PGDASD(CNPJ_MATRIZ)
ALTER INDEX {nome_indice | ALL} ON REBUILD ALTER INDEX {nome_indice |
ALL} ON REORGANIZE
Designer: ou clicar botão direito sobre a TABELA, expandir, ir até
Indexes(índice) e criar um novo índice.
REGRAS - RULES
São configurações que permitem especificar como determinados
parâmetros de banco de dados devem se comportar, como exemplo, limitar
faixar de valores em determinadas colunas, ou especificar valores
inválidos para registro
Comando:
Criando a Regra
CREATE RULE CONTROLE_PRECO AS @VALOR > 10.00
Consulta a Regras dentro de Programability / Regras
Executando, inserindo a Regra para um campo da tabela especifica
(através da procedure)
EXECUTE SP_BINDRULE CONTROLE_PRECO, 'PRODUTOS.PRECO'
Inserindo (Não aceitará – Preço está abaixo do estabelecido)
INSERT INTO PRODUTOS VALUES(1, 'MAÇÃ', 5.00, 2)
Inserindo (Aceitará)
INSERT INTO PRODUTOS VALUES(1, 'MAÇÃ_COM_REGRA_DE_PREÇO', 15.00, 2)
SELECT * FROM PRODUTOS
OBS: Fazer com a regra impeça as atualizações indevidas no banco de
dados.
DECLARAÇÃO DE VARIAS
Pode ser declarado variáveis no SQL SERVER. Dentro de um batch
ou um procedimento.
Pode-se atribuir valores a ela com a declaração SET ou SELECT.
As variáveis por padrão são criadas Nulas (NULL)
USANDO VARIÁVEIS NO SQL SERVER
Declarando
DECLARE @Valor Int,
@Texto VARCHAR(40),
@Data_Nasc DATE,
@Nada MONEY -- Vai retornar Null na chamada / A
ultima linha não precisa de virgula
Setando (Um SET p cada um e sem virgula)
SET @Valor = 50
SET @Texto = 'JOAO DA SILVA'
SET @Data_Nasc = GETDATE()
SET @Nada = 100.00
Mostrando o Valor das Variáveis
SELECT @Valor AS VALOR, @Texto AS TEXTO, 'Data de Nascimento', @Nada
AS SALÁRIO
Setando uma coluna do banco para dentro de uma Variavvel (Tudo sem
virgula) - Ela so retorna um valor - ultimo
DECLARE @Livro VARCHAR(40)
SELECT @Livro = Nome FROM TBL_LIVROS Where Id_Livro = 102
Mostrando a coluna setada
SELECT @Livro AS 'NOME DO LIVRO'
Exemplo com calculos varias colunas do Banco (Multiplicandois entre
elas as Variave)
DECLARE @Preco MONEY, @Qtde INT, @Nome VARCHAR(40)
SET @Qtde = 5
Atribuindo as coluas as Var
SELECT @Nome = Nome, @Preco = Preco_Livro FROM TBL_LIVROS Where
ID_LIVRO = 102
Mostrando Calculado
SELECT @Nome AS 'LIVRO', @Preco * @Qtde AS 'PREÇO DOS LIVROS'
IF e IF ELSE
Executar uma linha conforme o retorna de a condição.
Executa apenas uma linha após a condição. Para executar mais de
uma linha deve usar Begin bloco de código End. Mesma coisa par ao ELSE
Begin bloco de código End.
TRABALHANDO COM IF E ELSE
Exemplo Simples:
if 1 > 2 SELECT 'MAIOR' ELSE SELECT 'MENOR'
Declarando
DECLARE @Numero Int,
@Texto VARCHAR(40),
@Data_Nasc DATE,
@Valor MONEY
Setando
SET @Numero = 20
SET @Texto = 'SERGIO'
SET @Valor = 10
Pela condição
IF @Numero = 20 SELECT ' Numero Correto'
IF e ELSE
IF @Texto = 'Ana'
BEGIN
SET @Numero = 30
SELECT @Numero AS 'Idade'
END;
ELSE
BEGIN
SET @Numero = 40
SELECT @Numero AS 'Idade Incorreta'
END;
IF E ELSE COM BANCO DE DADOS
Declarando
DECLARE @Nome VARCHAR(50),
@Media REAL,
@Resultado VARCHAR(50)
Buscando as Notas do Banco
SELECT
@Nome = Nome_Aluno,
@Media = (ALUNOS.Nota1 + ALUNOS.Nota2 + ALUNOS.Nota3 +
ALUNOS.Nota1) / 4
FROM ALUNOS
WHERE Nome_Aluno = 'Rafael'
Mostrando Teste
SELECT @Nome, @Media AS 'MEDIA'
Verificações
IF @Media >= 7.00
BEGIN
--Seta como Aprovado
SELECT @Resultado = 'APROVADO'
END;
ELSE
BEGIN
--Seta como Reprovado
SELECT @RESULTADO = 'REPROVADO'
END;
Mostrando o Resultado Final
SELECT 'O Aluno "' + @Nome + '" está ' + @Resultado + ' Com Média ' +
CAST(@Media AS VARCHAR)
WHILE
Estrutura de repetição. Executa um código enquanto uma função
for verdadeira. Para bloco de comandos também precisa BEGIN bloco END.
WHILE
DECLARE @Valor Int
SET @Valor = 0
Mostrando
WHILE @Valor < 10
BEGIN
--Mostrando
PRINT 'NUMERO:' + CAST(@Valor AS VARCHAR)
--Incrementa
SELECT @Valor = @Valor + 1
END;
Usando campos do Banco de Dados
DECLARE @Codigo Int
SET @Codigo = 100
Mostrando os Livros com Codigo menor que 106
WHILE @Codigo < 110
BEGIN
Mostrando
SELECT ID_LIVRO AS ID, NOME AS LIVRO, PRECO_LIVRO AS PREÇO FROM
TBL_LIVROS WHERE ID_LIVRO = @Codigo
--select @codigo
Incremento
SET @Codigo = @Codigo + 1
END;
PROCIDURE
São lotes (Batches) de declaração SQL que podem ser declarados
como uma subrotina a parte.
Vantagem: permite centralizar a lógica de acesso aos dados em um
único local. Facilitando a manutenção e a otimização do código.
Também é possível ajustar permissões de acessos aos usuários,
definindo quem pode ou não executá-las.
CRIAÇÃO:
Criando sem Var
CREATE PROCEDURE CONSULTAR_VENDEDORES
as
begin
Select * FROM VENDEDOR
end
Criando sem Var e Consulta ao Campo com Parametro
CREATE PROCEDURE CONSULTA_LIVRO (@IdLivro INT)
AS
BEGIN
SELECT NOME, PRECO_LIVRO FROM TBL_LIVROS
WHERE ID_LIVRO = @idLivro
END
--Executando
EXEC CONSULTA_LIVRO 102
Criando sem Var e Consulta ao Campo com 2 Parametro
CREATE PROCEDURE CONSULTA_LIVRO_2 (@IdLivro INT, @Preco MONEY)
AS
BEGIN
SELECT NOME, PRECO_LIVRO FROM TBL_LIVROS
WHERE ID_LIVRO > @idLivro AND PRECO_LIVRO < @Preco
END
Buscando livros com preço Menor que 200
EXEC CONSULTA_LIVRO_2 100, 200.00
Criando sem Var e Consulta ao Campo com 2 Parâmetros
CREATE PROCEDURE COMPRA_LIVRO (@IdLivro INT, @Qtde INT)
AS
BEGIN
SELECT NOME, PRECO_LIVRO * @Qtde FROM TBL_LIVROS
WHERE ID_LIVRO = @idLivro
END
Id e Qtde que quero levar
EXEC COMPRA_LIVRO 112, 2
CRIANDO UMA COMPLETA
/*
CREATE TABLE PESSOA (
Id int not null primary key identity,
Name varchar(50) not null,
Status int not null
)
*/
/*
CREATE TABLE CLIENTE(
Avissa que o ID vem da tabela pessoa
Pessoa_Id int not null references PESSOA,
Credito Decimal(10,2) not Null
)
*/
OBS: para inserir em Vendedor ou Cliente, primeiro é necessário
inserir em PESSOA
/*
CREATE TABLE VENDEDOR(
Pessoa_ID int not null References Pessoa,
Salario decimal(10,2) not null
)
*/
Inserindo em Pessoa e Vendedor
INSERT INTO PESSOA VALUES('CARLOS',1)
INSERT INTO VENDEDOR VALUES(2, 2000.00)
delete from vendedor where Pessoa_ID = 1
select * FROm PESSOA
select * FROm VENDEDOR
Mostrando com Chave Estrangeira
select * from vendedor join PESSOA ON VENDEDOR.Pessoa_ID =
PESSOA.Pessoa_ID
Criando a Procidure Completa
CREATE PROCEDURE ADD_VENDEDOR
(
Criando variaveis: Mesmo Tamanho do campo
@nome varchar(50),
@status int,
@salario decimal(10,2)
)
as
begin
Aqui vai ser gerado uma outra pessoa e será gerado um novo
ID(Auto Incremente)
INSERT INTO PESSOA VALUES(@nome , @status)
@@IDENTITY: faz com que ele coloque aqui a ultima ID gerado
acima no banco pelo auto incremente
INSERT INTO VENDEDOR VALUES(@@IDENTITY , @salario)
end
Executando a Procedure
EXEC ADD_VENDEDOR 'SERGIO2', 0, 2000.00
PROCIDURE CONTINUAÇÃO
Sp_helptext: visualizar o conteúdo de texto de um procedimento
armazenado.
Ex: EXEC sp_helptext TESTE
Criando uma procidure criptografada:
CREATE PROCEDURE CONSULTAR_VENDEDORES
WITH ENCRYPTION
as
begin
Select * FROM VENDEDOR
end
Mostrando
EXEC CONSULTAR_VENDEDORES
Tentando ver seu conteudo
EXEC sp_helptext CONSULTAR_VENDEDORES
ALTERANDO UMA PROCIDURE:
Você precisa praticamente escrever todo o código novamente, mas
desta vez seguido do termo ALTER e com as alterações que se quer
fazer.
Sobrepõe a procidure Anterior
ALTER PROCEDURE CONSULTAR_VENDEDORES (@Par1 AS INT)
As
begin
SELECT @Par1 * 2
end
Executando
EXEC CONSULTAR_VENDEDORES 10
Executando 2
EXEC CONSULTAR_VENDEDORES @par1 = 10
Procidure com Valor Padrão:
Cria com valor padrão para um parâmetro
CREATE PROCEDURE CADASTRAR (@Nome AS Varchar(50), @Salario AS MONEY =
500.00)
As
begin
INSERT INTO VENDEDOR(Nome, Salario) Values(@Nome, @Salario)
end
Executando sem passar o valor do Salário (ou seja gravou o valor
padrão do banco)
EXEC CADASTRAR 'Pedro da Silva'
Executando sem 2 valores
EXEC CADASTRAR 'Mariana', 1500
PROCIDURE COM PARAMETRO DE SAÍDA
Ele habilita o procedimento a retornar dados para o procedimento
chamador.
Usa-se a palavra-chave OUTPUT quando o procedimento é criado e
também quando é chamado.
Ele aparece como se fosse uma variável local. E o chamador
recebe-o dentro de uma variável.
Procedure com Parametro de SAIDA
CREATE PROCEDURE PROC_SAIDA (@Par1 AS INT OUTPUT)
As
begin
SELECT @Par1 * 2
RETURN
end
Declra-se a variavel (bidimensional - leva e traz)
DECLARE @Valor AS INT = 15
Executa (leva o valor e traz o resultado na mesma var) - Porque é
OUTPUT
EXEC PROC_SAIDA @Valor OUTPUT
Mostra
PRINT @Valor
COMANDO RETURN
Termina incondicionalmente o procedimento retorna um valor
inteiro ao chamador. Pode-se usar para indicar um estado do programa,
sucesso ou falha.
Criando
CREATE PROCEDURE PROC_RETORNO (@IdLivro SMALLINT, @Qtde SMALLINT, @Cod
SMALLINT = -10)
AS
SET NOCOUNT ON (Evita a contagem de linhas afetadas)
IF @IdLivro > 100
BEGIN
SELECT NOME, PRECO_LIVRO * @Qtde FROM TBL_LIVROS
WHERE ID_LIVRO = @idLivro
RETURN 1
END
ELSE
RETURN @Cod
Chamando e jogando o Retorno para dentro da Var
DECLARE @Codigo INT
EXEC @Codigo = PROC_RETORNO 102, 2
Imprime o Retorno
PRINT @Codigo
FUNCTION
UDF Funções Definidas pelo Usuário
Podemos criar funções (UDF) para realizar diversas tarefas
distintas no banco de dados. Tais como:
Inserir lógica complexa em uma consulta; Criar Novas Funções
para expressões complexas; Substituir exibições com a vantagem de
aceitar parâmetros.
Há Vários tipos de UDF: Funções Escalares, Valor de Tabela
Embutida, Valor de Tabela Multi-instruções.
FUNÇAO ESCALAR:
É aquela que executa algo e retorna um valor específico
escolhido.
--FUNÇÕES: Muito parecido com a PROCEDURE, porem deve-se setar um tipo
de retorno que se quer
--Criando a Função (Este Retorno é com "S")
CREATE FUNCTION MEDIA_ALUNO(@Nome VARCHAR(50))
RETURNS REAL
AS
BEGIN
--Var que Recebe a Media
DECLARE @Media REAL
-- Joga o res. dos campos para dentro da var
SELECT @Media = (ALUNOS.Nota1 + ALUNOS.Nota2 + ALUNOS.Nota3 +
ALUNOS.Nota1) / 4
FROM ALUNOS WHERE Nome_Aluno = @Nome
--Retorno
RETURN @Media
END
--Chamando a Função
SELECT dbo.MEDIA_ALUNO('Maria')
FUNÇAO DE TABELA EMBUTIDA OU INLINE
São similares a uma exibição(View). Porém permitem utilizar
parâmetros. Retornam um conjunto completo de dados. Destaque
para o RETURNS TABLE: pois retornará vários valores/Linhas.
--FUNÇÃO DE TABELA EMBUTIDA OU INLINE
CREATE FUNCTION RETORN_ITENS(@Valor REAL)
RETURNS TABLE
AS
--O retorn o será o próprio SELECT
RETURN (
SELECT L.Nome, A.Nome_Autor FROM TBL_LIVROS AS L
INNER JOIN TBL_AUTORES AS A
ON L.ID_AUTOR = A.ID_AUTOR
Where L.PRECO_LIVRO > @Valor
Executando: aqui preciso especificar quais campos da tabela embutida
ela vai me retornar
--Ao mesmo tempo que do um select, mostro, eu a chamo passando os
parâmetros
SELECT NOME, NOME_AUTOR FROM RETORN_ITENS(10)
FUNÇAO DE TABELA EMBUTIDA – COM VÁRIAS INTRUÇÕES
É uma combinação de Função escalar com função de tabela
embutida. Retorna um resultset na forma de uma tabela.
Você pode montar a tabela e os tipos de dados específicos
que ela vai retornar.
Criando Função | Retorna a tabela criada para dentro de uma Var
CREATE FUNCTION MULTI_TABELA()
RETURNS @Valores Table
(
Nome_Livro VARCHAR(50),
Data_Pub DateTime,
Nome_Editora VARCHAR(50),
Preco_Livro MONEY
)
AS
BEGIN
joga a consulta para dentro da tabela virtual através da var criada
INSERT @Valores (Nome_Livro, Data_Pub, Nome_Editora,
Preco_Livro)
SELECT L.NOME, L.DATA_PUB, E.Nome_Editora, L.PRECO_LIVRO
FROM TBL_LIVROS AS L
INNER JOIN TBL_EDITORAS AS E
ON L.Id_Editora = E.ID_Editora
RETURN -- Fim
END
Chamando a função com valor de tabela embutida - Poderia passar
parâmetro
SELECT * FROM MULTI_TABELA()
TRIGGER
Um Trigger(gatilho) é um tipo especial de Stored Procedure que é
executado automaticamente quando um usuário realiza uma operação de
modificação de dados em uma tabela especificada.
As operações que podem disparar um trigger são: ISERT, UPDATE,
DELETE.
O trigger pode ser AFTER (depois) ou ISTEAD OF (em vez de).
AFTER: só executa o gatilho após todas as ações (insert, update e
delete) terem sido executadas na tabela.
ISTEAD OF: neste caso o gatilho é executado no lugar da operação que
causou o disparo. Ex: em vez de deletar o faça tal coisa.
AFTER:
--Criando o trigger
CREATE TRIGGER TESTE_TRIGGER_AFTER
ON TBL_LIVROS
AFTER INSERT -- Escolha depois de qual ação (INSERT, UPDATE, DELETE)
AS
PRINT 'O DADO FOI INSERIDO';
--Fazendo teste: inserir para ver se o trigger vais er ativado
INSERT INTO TBL_LIVROS(NOME) Values('LIVRO 8')
Apagando uma Trigger:
DROP TRIGGER TESTE_TRIGGER_AFTER
Alterar Trigger: reescrever a trigger mas no lugar da palavra CREATE,
coloca-se a ALTER
ALTER TRIGGER TESTE_TRIGGER_AFTER
Trigger inserindo em varias tabelas
--Criando o trigger
CREATE TRIGGER TESTE_TRIGGER_AFTER
ON TBL_LIVROS
AFTER INSERT -- Escolha depois de qual ação (INSERT, UPDATE, DELETE)
AS
--Vai se inerido também um dados na tabela Editora e Autor
--Fazendo teste: inserir para ver se o trigger vais er ativado
INSERT INTO TBL_AUTORES(Nome_Autor, Sobre_Nome_Autor) Values('RUI', 'CHAPEU')
INSERT INTO TBL_EDITORAS(Nome_Editora) Values('ALIANÇA')
--Inserir em Livros para ver se o trigger também insirirá nas duas
ouyttas tabelas
INSERT INTO TBL_LIVROS(Nome) Values('NOVO LIVRO')
INSTEAD OF:
Criando o trigger ISTEAD OF
CREATE TRIGGER TESTE_TRIGGER_INSTEAD_OF
ON TBL_LIVROS
INSTEAD OF DELETE -- Destaca qual ação vai substituir
AS
Ao em vez de fazer a ação executa o comando abaixo
PRINT 'HOUVE UMA TENTATIVA DE DELEÇÃO'
Fazendo teste: inserir para ver se o trigger vais er ativado
DELETE FROM TBL_LIVROS Where id_Livro = 102
HABILITAR E DESABILITAR TRIGGER
O trigger pode ser temporariamente desabilitado. Usar o comando
DDL ALTER TABLE.
Habilitando e Desabilitando um Trigger: ENABLE | DISABLE
ALTER TABLE TBL_LIVROS
DISABLE TRIGGER TESTE_TRIGGER_INSTEAD_OF
ALTER TABLE TBL_LIVROS
ENABLE TRIGGER TESTE_TRIGGER_INSTEAD_OF
VERIFICAÇÃO DE TRIGGER
Verificar a existência de Trigger e seus STATUS
EXEC sp_helptrigger @tabname = TBL_LIVROS
Todos os Trigger do Banco:só habilitados ou Desabilitados
SELECT * FROM sys.triggers
WHERE is_disabled = 0
TRIGGER UPDATE
A função UPDATE() retorna true caso uma coluna especificada
tenha sido alterada por uma transação DML.
Criando o trigger UPDATE
CREATE TRIGGER TESTE_AFTER_UPDATE
ON TBL_LIVROS
AFTER INSERT, UPDATE
AS
Se foi a coluna "Nome" quem recebeu atualização então executa ou não
IF UPDATE(Nome)
BEGIN
PRINT 'O nome do livro foi Atualizado';
END
ELSE
BEGIN
PRINT 'NÃO FOI O NOME DO LIVRO QUE FOU ATUALIZADO';
END
Atualizando o Nome
UPDATE TBL_LIVROS set NOME = 'Teste' where ID_LIVRO = 103
Atualizando o Sobre Nome
UPDATE TBL_LIVROS set ISBN = 'ISBN Teste' where ID_LIVRO = 103
ANINHAMENTO DE TRIGGER
É quando o trigger dispara um outro evento ou ele mesmo. Para
que isso funcione a opção que gatilhos disparem outros gatilhos devem
estar habilitada. Ou usa a linha de comando abaixo:
EXEC sp_configure ‘Nested Trigger’, 0 | 1;
RECONFIGURE; (0 desabilita; 1 habilita)
(ESTUDAR MAIS ESTE ASSUNTO)
Zerar campo auto incremente da tabela:
Basta digitar esta linha de comando:
DBCC CHECKIDENT ('Nome_tabela', RESEED, 0)
FAZER BKP DA TABELA OU DO BANCO DE DADOS INTEIRO
Nesta opção você pode escolher gerar SQL só da estrutura do Banco ou da tabela. Ou
SQL só dos dados da tabela. Ou SQL da Estrutura e dos dados juntos.
Bkp Exportar dados direto entre bancos de dados:
Botão Direito em cima da Base de Dados / Tasks / Export Date / Fonte é o próprio Banco /
Próxima página escolher o destino: colocar o IP da máquina de destino na segunda linha / Na
parte de baixo do form escolher a base de dados.
OBS: ignorar o campo código. Deixar todos os campos iguais
GERAR SCRIPT COMPLETO DOBANCO:
Botão Direito em cima da Base de Dados: Botão Direito no Banco / Tasks / Generate Script:
Gerar Script: (não aguenta muitos dados depois para ser importado)
Botão Direito em cima da Base de Dados / Tasks / Generate Script: na tela que se segue
colocar para escolher as tabelas a serem copiadas (Select Specific Data Base) / Após ticar na
tabela escolhida/ Clicar no botão Advanced / Aí na Opção: “Type of data to Script”: escolher
a opção “Data Only” – somente dados.
Aumentar a Performance do SQL Server:
SQL Server 2012 / Performance Tool / SQL Server Profile: Executar o botão New Trace.
Gerará um arquivo com todos os de SQL que o progroma está usando, salvar e abrir no
programa abaixo.
Data Base Egine Tuning Advisor: dentro deste programa abrir o arquivo “trace” que ele
indicará o que deve ser feito para melhorar a performance do banco. Ticar o Banco / e Abrir o
arquivo e mandar executar: Start Analysis.
CRIAR TABELA NA MEMORIA DO BANCO EM TEMPOD E
EXECUÇÃO
Só funciona em tempo de execução na mesma consulta
DECLARE @Tabela TABLE
codigo smallint not null,
nome varchar(20)
INSERT INTO @Tabela(codigo, nome) VALUES(1, 'leivio')
INSERT INTO @Tabela(codigo, nome) VALUES(2,'Nome1')
INSERT INTO @Tabela(codigo, nome) VALUES(3,'Nome1')
/*Exemplo de Select*/
SELECT * FROM @Tabela
SELECIONA OU CRIA A TABELA CUJO NOME É PASSADA POR
PARAMETRO
O nome da tabela é passada por variável.
Declare @NomeTabela as varchar(255)
set @NomeTabela = 'USUARIO'
exec ('Select * from ' + @NomeTabela)
--Crea Procidure que cria uma tabela cujo o nome da Tabela Foi passado por
Parametro
CREATE PROCEDURE INSERE_EMBASAMENTO_LEGAL(@NomeTabela as varchar(255))
AS
BEGIN
Declare @NomeTabelaAux as varchar(255)
set @NomeTabelaAux = @NomeTabela
--exec ('select * from OFICIO_SERGIO')
exec ('UPDATE ' + @NomeTabelaAux + ' SET EMBASAMENTO_LEGAL = ' + '''Texto
Teste''')
END
CASE
Pedidos
id data forma_pagamento valor
1 12/09/2008 1 108,00
2 17/09/2008 2 52,00
3 18/09/2008 3 328,00
Utilizando Case com Select :
SELECT Nome, id,
CASE id
when 1 then 'Boleto'
when 2 then 'Cartão VISA'
when 3 then 'Cartão MASTERCARD'
end as "TIPO PAGAMENTO",
VALOR FROM TESTE
RESTAURAR BANCO DE DADOS
Serve para jogar um banco sobre o outro com a estrutura parecida. Exemplo Jogar o
Banco Produção sobre o Demostrativo de desenvolvimento.
Botão Direito Base de Dados / Task / Restore / Base Dados / Device – De onde Pegará
Ir menu esquerda - Files: Ticar em : “Realocate All Files TO foldes”
Options: Ticar “OveWriti the existing DataBase”.
COIPAR BASE DE DADOS INTEIRA:
Copiar de uma Base dados para Outra: Botão Direito na Base de dados recebera novas tabelas
/ Importar Dados / Indicar de onde será importado / Para Onde será Importado.
EVENTOS LOG – REGISTRO DO SISTEMA
Mostrar Log de Email:
* SELECT FROM msdb.dbo.sysmail_event_log
LIBERANDO MEMORIA DO SQL SERVER
Para evitar erro “memory fop out”: que é o sistema operacional que fica sem memoria
Este é o comportamento do SQL Server, ele assume que toda a memória do
servidor disponível é para ele. E caso alguma aplicação precise, ele faz a
liberação de acordo com a sua carga.
Se você quiser limitar o consumo de memória do SQL Server, faça o seguinte:
Botão direito na instância -> Properties -> Memory -> Maximum Server
Memory (MB) e coloque o valor desejado como limite para o SQL Server (em
Mega!)
Se quiser fazer via T-SQL:
EXEC sys.sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'6000' --
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'show advanced options', N'0' RECONFIGURE WITH OVERRIDE
GO
LIMITAR A QTDE DE REGISTRO NA CONSULTA: TOP + NUEMRO
select top 5 * from CARTAO_DEBITO_CREDITO
COMMIT - LIGAR E DESLIGAR AUTO COMMIT
Você pode ativar a confirmação automática configurando implicit_transactions OFF:
SET IMPLICIT_TRANSACTIONS OFF
Desta forma o SQL SERVER comitará autoamticamente
SET IMPLICIT_TRANSACTIONS ON:
Desta forma precisa sempre dar um commit.
Talvez um exemplo seja mais claro. Isso gravará uma alteração no banco de dados:
SET IMPLICIT_TRANSACTIONS ON
UPDATE MyTable SET MyField = 1 WHERE MyId = 1
COMMIT TRANSACTION
Isso não gravará uma alteração no banco de dados:
SET IMPLICIT_TRANSACTIONS ON
UPDATE MyTable SET MyField = 1 WHERE MyId = 1
ROLLBACK TRANSACTION
DATA:
Montando data copiando de uma coluna que ela está em português jogando para
outra coluna que está padrão americano:
select SUBSTRING(DATA_OPERACAO, 7, 4) from [Cartão 2016 - Completo_02(62)]
select SUBSTRING(DATA_OPERACAO, 4, 2) from [Cartão 2016 - Completo_02(62)]
select SUBSTRING(DATA_OPERACAO, 1, 2) from [Cartão 2016 - Completo_02(62)]
FORMATAÇÃO UNICODE:
Unicode é um padrão adotado mundialmente que possibilita com que
todos os caracteres de todas as linguagens escritas utilizadas no planeta
possam ser representados em computadores. A “missão” do Unicode é
apresentada de forma clara no web site do Unicode Consortium (entidade
responsável pela sua gestão):
Unicode fornece um número único para cada caractere, não importa a
plataforma, não importa o programa e não importa a linguagem.
IMPORTANDO DADOS PARA O BANCO SEM ERROS
Banco De dados / Botão Direito na Base de Dados / Task / Import Data /
Usando o Wizard/Guia: Data Source: escolher o tipo de dados: Microsoft Excel
para Excel para ou CSV / ou Flat File Surce para Arquivo TXT / Escollher o
Arquivo / Em Header Row Delimiter: Semicolon {;} / Escolher(ESSENCIAL: Nesta
Mesma Tela Clicar em Advanced) / Ir Propriedade Data Type / Colocar todos como
“text stream [DT_TEXT]” / (Isso fará que carregue arquivos Gigantes sem
problemas)
OBS: Carregar todos como varchar(MAX). Depois fazer os cast (conversões na
hora de copiar os arquivos).
Exemplo de Inserção de uma tabela toda dentro de outra com cast – convertendo
na hora de copiar:
INSERT INTO CARTAO_DEBITO_CREDITO_BRUTO(IE, CNPJ, NOME_CREDOR, MUNICIPIO,
CNPJ_OPERADORA, NOME_OPERADORA, DATA_OPERACAO, NUMERO_OPERACAO,
NATUREZA_OPERACAO, DEBITO_CREDITO, VALOR_OPERACAO)
select TOP 10 IE, CNPJ, NOME_CREDOR, MUNICIPIO, CNPJ_OPERADORA, NOME_OPERADORA,
SUBSTRING(DATA_OPERACAO, 7, 4) + '/' + SUBSTRING(DATA_OPERACAO, 4, 2) + '/' +
SUBSTRING(DATA_OPERACAO, 1, 2), NUMERO_OPERACAO, NATUREZA_OPERACAO,
DEBITO_CREDITO, CAST(VALOR_OPERACAO AS MONEY) from CARTAO_2016
JUNTAR – UNIR - UNIFICAR ARQUIVOS CSV ou TXT PELO DOS - CMD:
Entre dentro da pasta com todos Arquivos - ex "c:\csv" digite o comando:
copy *.csv unificado.csv
SUBSTUIR CARACTERES:
Select replace (VALOR, ',', '.') as 'VALOR' From 'CARTAO'
DESCOBRIR O NOME E TIPO DE CAMPOS DA TABELA:
Use SIMPLESI
Go
SP_Columns CARTAO_2019_VIRTUAL_BRUTO
Go
ISDATE
Verifica se a data é valida. Se retornar 0 é porque a data é falsa. 1 para
data verdadeira:
Retornará 1 se a expressão for um valor data, time ou datetime válido; caso
contrário, 0.
SELECT ISDATE('--sa11') : Retorno será 0 – Não é uam data valida
SELECT ISDATE('2007-3-01'): O Retorno será 1 – è uam data valida