UM BREVE TREINAMENTO SOBRE SQL E SUAS FUNCIONALIDADES WILLIAM COSTA
UM BREVE TREINAMENTO SOBRE SQL E SUAS FUNCIONALIDADES
WILLIAM COSTA
INTRODUÇÃO
O QUE VEREMOS?▸ Introdução
▸ Por que saber SQL
▸ SQL e suas vantagens
▸ Subconjuntos da linguagem
▸ Linguagem de Consulta de Dados
▸ Query simples
▸ Funções agregadas
▸ Funções específicasdo SQL Server
▸ Conversão de dados
▸ Estrutura de repetição
▸ Query Elaborada
▸ Junções
▸ Agrupando dados
▸ Ordenando dados
▸ Cláusula HAVING
▸ Operadores Lógicos e Matemáticos
▸ Produto cartesiano
▸ Usando apelidos
▸ Subconsulta
▸ Linguagem de definição de Dados
▸ Triggers
▸ Tables
▸ Views
2
INTRODUÇÃO
O QUE É SQL
▸ Linguagem utilizada para manipulação de dados em banco de dados.
▸ Structured Query Language
3
POR QUE SABER SQL?
4
SQL E SUAS VANTAGENS
POR QUE SABER SQL?
▸ É uma linguagem simples;
▸ Largamente utilizada, seja em uma empresa de pequeno ou médio porte ou no Google, sempre existirá uma aplicação que utilize SQL;
▸ É uma linguagem "estática", isto é, poucas mudanças ocorrem na linguagem;
5
SQL E SUAS VANTAGENS
MAS EM EMPRESAS DE PEQUENO E MÉDIO PORTE?
▸ SQL irá facilitar seu trabalho;
▸ Algumas funcionalidades de sistemas exigem que você saiba SQL (como relatórios personalizados e integração externa);
6
SQL > SUBCONJUNTOS DA LINGUAGEM
A LINGUAGEM PODE SER DIVIDIDA EM:
▸ DML - Linguagem de Manipulação de Dados
▸ DDL - Linguagem de Definição de Dados
▸ DCL - Linguagem de Controle de Dados
▸ DTL - Linguagem de Transação de Dados
▸ DQL - Linguagem de Consulta de Dados
7
SQL > SUBCONJUNTOS DA LINGUAGEM
DML - LINGUAGEM DE MANIPULAÇÃO DE DADOS
▸ INSERT
▸ UPDATE
▸ DELETE
8
SQL > SUBCONJUNTOS DA LINGUAGEM
DDL - LINGUAGEM DE DEFINIÇÃO DE DADOS
▸ CREATE
▸ Table
▸ Index
▸ View
▸ ...
▸ DROP
▸ Table
▸ Index
▸ View
▸ ...
9
▸ ALTER
▸ Table
▸ Index
▸ View
▸ ...
SQL > SUBCONJUNTOS DA LINGUAGEM
DQL - LINGUAGEM DE CONSULTA DE DADOS
▸ SELECT
10
SQL > LINGUAGEM DE CONSULTA DE DADOS
▸ Embora seja composto por apenas um comando, este é o subconjunto mais utilizado
SELECT id, n_identificador, n_folha, nome FROM pessoas
SELECT * FROM pessoas
SELECT * FROM pessoas WHERE id = 1
SELECT * FROM pessoas ORDER BY nome DESC
SELECT * FROM pessoas WHERE id IN (1, 2, 3)
SELECT * FROM pessoas WHERE id IN (SELECT pessoa_id FROM eventos_acessos)
11
DQL - LINGUAGEM DE CONSULTA DE DADOS
SQL > LINGUAGEM DE CONSULTA DE DADOS
Esse comando possui as seguintes cláusulas:▸ FROM
▸ WHERE
▸ GROUP BY
▸ HAVING
▸ ORDER BY
▸ DISTINCT
▸ UNION
12
SQL > LINGUAGEM DE CONSULTA DE DADOS
Veremos neste breve treinamento
▸ WHERE
▸ GROUP BY
▸ HAVING
▸ ORDER BY
13
SQL É QUASE COMO ESCREVER (EM INGLÊS) O QUE O SGBD IRÁ FAZER, POR EXEMPLO:
14
SELECIONAR TUDO DA TABELA DE PESSOAS ONDE O ID FOR MAIOR DO QUE 1, ORDENANDO OS RESULTADOS POR NOME DE FORMA DECRESCENTE
Descrição em português do que será feito
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES 15
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES 16
SELECT * FROM pessoas WHERE id > 1 ORDER BY nome DESC
Instrução SQL
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > FUNÇÕES AGREGADAS
▸ O SQL possui algumas funções que atuam sobre grupos de registros, estas são chamadas de funções agregadas. Entre as mais comuns podemos listar:
▸ COUNT: Retorna o número de linhas afetadas pelo comando.
▸ SUM: Retorna o somatório do valor das colunas especificadas.
▸ AVG: Retorna a média aritmética dos valores das colunas.
▸ MIN: Retorna o menor valor da coluna de um grupo de linhas.
▸ MAX: Retorna o maior valor da coluna de um grupo de linhas.
17
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > FUNÇÕES AGREGADAS
Exemplos:
▸ COUNT: SELECT COUNT(*) FROM pessoas
▸ SUM: SELECT SUM(valor_refeicao) FROM eventos_acessos
▸ AVG: SELECT pessoa_id, AVG(valor_refeicao) FROM eventos_acessos GROUP BY pessoa_id
▸ MIN: SELECT MIN(id) FROM pessoas
▸ MAX: SELECT MAX(id) FROM pessoas
18
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > FUNÇÕES ESPECÍFICAS
O SQL Server possui algumas funções específicas, entre elas podemos citar:
▸ LEN: Retorna a quantidade de caracteres da coluna indicada
▸ SUBSTRING: Retorna uma parte da string
▸ GETDATE: Retorna a data e hora do Windows
▸ ISNULL: Retorna um valor específico para todos os registros cujo a expressão avaliada seja NULL
▸ ISNUMERIC: Verifica se a expressão avaliada é numérica
19
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > FUNÇÕES ESPECÍFICAS
Exemplos:
▸ LEN: SELECT LEN(n_identificador) FROM pessoas
▸ SUBSTRING: SELECT SUBSTRING(n_identificador,1,10) FROM pessoas
▸ GETDATE: SELECT GETDATE() | SELECT GETDATE() - 10
▸ ISNULL: SELECT ISNULL(valor_refeicao, 15) FROM eventos_acessos
▸ I S N U M E R I C : S E L E C T * F R O M p e s s o a s W H E R E ISNUMERIC(n_identificador) = 0
20
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > FUNÇÕES ESPECÍFICAS
Usando funções no WHERE:
▸ LEN: SELECT * FROM pessoas WHERE LEN(n_identificador) > 8
▸ GETDATE: SELECT * FROM eventos_acessos WHERE data = CONVERT(datetime, CONVERT (varchar(10), GETDATE()-1, 120), 102)
▸ IS NULL: SELECT * FROM pessoas WHERE n_identificador IS NULL
▸ ISNUMERIC: SELECT * FROM pessoas WHERE ISNUMERIC(n_identificador) = 0
21
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > CONVERSÃO DE DADOS
Em alguns casos, é necessário realizar a conversão do valor de uma coluna armazenada no banco de dados, para isso são utilizas as funções CAST e CONVERT.
Ex.:
▸ SELECT SUM(CAST(n_identificador) AS INT) FROM pessoas WHERE n_identificador IS NOT NULL
▸ SELECT * FROM eventos_acessos WHERE data = CONVERT(datetime, CONVERT (varchar(10), GETDATE()-1, 120), 102)
22
+ info: https://msdn.microsoft.com/pt-br/library/ms187928.aspx
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > ESTRUTURA DE REPETIÇÃO
Em alguns casos, precisamos executar uma mesma query diversas vezes, para isso podemos utilizar uma estrutura de repetição, como no exemplo abaixo:
23
DECLARE @contador INT,
@fim INT
SET @contador = 1
SET @fim = (SELECT MAX (id) FROM pessoas)
WHILE @contador <= @fim
BEGIN
PRINT (@contador)
SET @contador = @contador + 1
END{Neste bloco pode ser inserida qualquer
instrução SQL, seja SELECT, UPDATE ou DELETE
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY SIMPLES > ESTRUTURA DE REPETIÇÃO
Exemplo:
DECLARE @i INT
SET @i = 1
WHILE @i <= 1200
BEGIN
INSERT INTO pessoas(n_identificador, nome, empresa_id, horario_id, estado, classificacao_id, criacao_usu_id, criacao_data) VALUES (@i, CONCAT('teste ', @i), 1, 1, 2 , 1, 2, GETDATE())
SET @i = @i + 1
END
24
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA
▸ Existem algumas consultas que necessitam de informações que estão em mais de uma tabela ou que necessitam de resultado de outras operações para obter os resultados desejados.
25
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA
▸ Estas consultas pode incluir o que chamamos de junções ou ainda de subconsultas, como nos seguintes exemplos:
SELECT *
FROM pessoas
WHERE id IN
(SELECT pessoa_id
FROM eventos_acessos
)
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos
JOIN pessoas ON pessoas.id = eventos_acessos.pessoa_id
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos, pessoas
WHERE pessoas.id = eventos_acessos.pessoa_id
26
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA
SELECT *
FROM pessoas
WHERE id IN
(SELECT pessoa_id
FROM eventos_acessos
)
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos
JOIN pessoas ON pessoas.id = eventos_acessos.pessoa_id
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos, pessoas
WHERE pessoas.id = eventos_acessos.pessoa_id
Subconsulta Junção
27
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÃO
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos
JOIN pessoas ON pessoas.id = eventos_acessos.pessoa_id
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos, pessoas
WHERE pessoas.id = eventos_acessos.pessoa_id }
RETORNAM O M
ESMO RESULTADO
28
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÃO
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos
JOIN pessoas ON pessoas.id = eventos_acessos.pessoa_id }
Chave primária da tabela pessoas
}Chave estrangeira da tabela eventos_acessos para tabela pessoas
Para realizar a junção das tabelas, sempre será utilizada a chave primária e a chave estrangeira das tabelas envolvidas, conforme o exemplo abaixo:
29
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÃO
IMPORTANTE: A ordem da chave primárias (PK) e estrangeira não afeta o resultado, isto é:
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos
JOIN pessoas ON eventos_acessos.pessoa_id = pessoas.id
SELECT pessoas.nome, eventos_acessos.data
FROM eventos_acessos
JOIN pessoas ON pessoas.id = eventos_acessos.pessoa_id }RETORNAM
O MESM
O RESULTADO
30
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÃO
Em alguns casos, necessitamos agrupar os dados, isso é bastante comum em relatórios ou para facilitar a análise dos dados, para isso usamos a instrução GROUP BY
Exemplo:
SELECT COUNT(*) AS qtd_batidas, f.nome FROM batidas b
JOIN funcionarios f ON f.id = b.funcionario_id
GROUP BY f.nome
31
AGRUPANDO DADOS:
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÃO
AGRUPANDO DADOS:
Em alguns casos, quando utilizamos funções agregadas é necessário utilizar o GROUP BY
32
Exemplo:
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÃO
ORDENANDO DADOS:Em alguns casos, é necessário ordenar os dados por uma coluna, por exemplo, uma listagem em ordem decrescente (baseada no nome). Para isso, utilizamos o comando ORDER BY
Exemplo:
SELECT * FROM pessoas ORDER BY nome DESC
33
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÃO
ORDENANDO DADOS:
O comando ORDER BY pode receber mais de uma coluna para "em caso de empate" ordenar com base na segunda coluna
Exemplo:
SELECT * FROM pessoas ORDER BY nome DESC, n_identificador ASC
34
SQL > LINGUAGEM DE CONSULTA DE DADOS > CLÁUSULA HAVING
CLÁUSULA HAVING:
A cláusula HAVING se comporta como uma espécie de WHERE para o GROUP BY. Através desta cláusula filtramos os resultados obtidos pela consulta.
35
SQL > LINGUAGEM DE CONSULTA DE DADOS > CLÁUSULA HAVING
CLÁUSULA HAVING:
Exemplo:
SELECT p.nome,COUNT(*) FROM eventos_acessos e
JOIN pessoas p ON p.id = e.pessoa_id
GROUP BY p.nome
HAVING COUNT(*) > 2
36
SQL > LINGUAGEM DE CONSULTA DE DADOS > CLÁUSULA HAVING
MAS POR QUE NÃO USAR O WHERE?Quando é utilizada uma função agregada, o uso do WHERE não é permitido
37
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES
OPERADORES LÓGICOS E MATEMÁTICOS:
O SQL possui alguns operadores lógicos e matemáticos que podem ser úteis em consultas entre eles:
38
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES MATEMÁTICOS
> (maior) < (menor) = (igual)
39
>= (maior ou igual) <= (menor ou igual) <> (diferente)
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
AND: Usado quando o registro deve ser selecionado ao cumprir duas ou mais condições, exemplo:
Selecionar todos os dados das pessoas que tenham identificador maior que 10 e que o número folha não seja nulo.
SELECT * FROM pessoas WHERE n_identificador > 10 AND n_folha IS NOT NULL
40
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
OR: Usado quando o registro deve ser selecionado ao cumprir uma ou outra condição, exemplo:
Selecionar todos os dados das pessoas que tenham identificador maior que 10 ou cujo número folha não seja nulo.
SELECT * FROM pessoas WHERE n_identificador > 10 OR n_folha IS NOT NULL
41
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
LIKE: Usado buscar um padrão em uma determinada coluna, exemplo:
Selecionar todos as pessoas cujo nome inicie com "Mar"
SELECT * FROM pessoas WHERE nome LIKE 'Mar%'
42
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
O % usado no LIKE indica que serão exibidos todos os registros cujo a coluna nome inicie por 'Mar'.
Existem outras formas de utiliza-lo, como por exemplo:
buscar um padrão em no início, no final ou no meio de uma determinada coluna, conforme os exemplos a seguir:
43
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
Listar todos os registros da tabela de pessoas que possuam a string "Silva" no final da coluna Nome.
SELECT * FROM pessoas WHERE nome LIKE '%Silva'
44
Serão listados todos os nomes que não iniciem com 'Silva', mas que possuem essa string, isto é, irá selecionar todas as pessoas cujo nome seja <QUALQUER COISA> Silva. Exemplo:
João da Silva Maria Silvana Maria Silva de Oliveira
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
Listar todos os registros da tabela de pessoas que possuam a string "da" em alguma da coluna Nome.
SELECT * FROM pessoas WHERE nome LIKE '%da%'
45
Serão listados todos os nomes que não iniciem com 'Silva', mas que possuem essa string, isto é, irá selecionar todas as pessoas cujo nome seja <QUALQUER COISA>da<QUALQUER COISA>. Exemplo:
João da Silva Eduarda Daiana
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
BETWEEN: Usado para indicar que a consulta será realizada entre dois valores, exemplo:
Selecionar todos as pessoas cujo n_identificador esteja entre 1 e 100
SELECT * FROM pessoas WHERE n_identificador BETWEEN 1 AND 100
46
SQL > LINGUAGEM DE CONSULTA DE DADOS > OPERADORES LÓGICOS
O comando BETWEEN pode ser substituído por uma comparação de maior que e menor que, exemplo:
SELECT * FROM pessoas WHERE n_identificador BETWEEN 1 AND 10
SELECT * FROM pessoas WHERE n_identificador > 0 AND n_identificador < 11
47
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > PRODUTO CARTESIANO
PRODUTO CARTESIANO
▸ É um problema bastante comum ao utilizar junções (principalmente quando envolve 3 ou mais tabelas).
▸ Ocorre quando a junção não foi feita ou foi realizada de forma incorreta.
▸ Consiste em listar na consulta um registro para cada combinação possível.
48
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > PRODUTO CARTESIANO
CREATE TABLE clientes(id int IDENTITY(1,1) NOT NULL, nome varchar(50) NOT NULL CONSTRAINT PK_clientes PRIMARY KEY (id)) CREATE TABLE carros(id int IDENTITY(1,1) NOT NULL, nome varchar(50) NOT NULL, cliente_id int NOT NULL FOREIGN KEY (cliente_id) REFERENCES clientes (id) CONSTRAINT PK_carros PRIMARY KEY (id))
49
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > PRODUTO CARTESIANO
INSERT INTO clientes (nome) VALUES ('João');INSERT INTO clientes (nome) VALUES ('Jeremias');INSERT INTO clientes (nome) VALUES ('Maria');INSERT INTO carros (nome, cliente_id) VALUES ('Monza', 1);INSERT INTO carros (nome, cliente_id) VALUES ('Corsa', 2);INSERT INTO carros (nome, cliente_id) VALUES ('Voyage', 3);
50
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > PRODUTO CARTESIANO
SELECT clientes.nome, carros.nome FROM clientes, carros;
Ocorrência de produto cartesiano ao realizar a consulta.
51
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > PRODUTO CARTESIANO
SELECT clientes.nome, carros.nome FROM clientes, carrosWHERE carros.cliente_id = clientes.id;
SELECT clientes.nome, carros.nome FROM clientesJOIN carros ON carros.cliente_id = clientes.id;
Resultado correto da consulta ao realizar a junção entre as tabelas
52
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÕES> USANDO APELIDOS
SELECT c.nome AS pessoa, ca.nome AS modelo FROM clientes c, carros caWHERE ca.cliente_id = c.id;
SELECT c.nome, ca.nome FROM clientes cJOIN carros ca ON ca.cliente_id = c.id;
53
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÕES> USANDO APELIDOS
SELECT c.nome AS pessoa, ca.nome AS modelo FROM clientes c, carros caWHERE ca.cliente_id = c.id;
SELECT clientes.nome, carros.nomeFROM clientes, carrosWHERE carros.cliente_id = clientes.id;
Com o uso de apelidos para tabelas e colunas
Sem o uso de apelidos para tabelas e colunas
54
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > JUNÇÕES
PARA REALIZAR A CONSULTA USANDO A JUNÇÃO VOCÊ DEVE:
▸ Indicar as colunas que serão selecionadas, lembrando que sempre será necessário indicar o nome da tabela(ou apelido) e o nome da coluna que deseja que seja listada.
Ex.: SELECT p.nome, e.data FROM eventos_acessos e JOIN pessoas p ON p.id = e.pessoa_id SELECT pessoa.nome, eventos_acessos.data FROM eventos_acessos JOIN pessoas ON pessoas.id = eventos_acessos.pessoa_id
55
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > SUBCONSULTA
▸ As subconsultas são um recurso interessante em querys que necessitam de informações de valores que referenciam os registros da tabela desejada.
▸ Elas podem ser utilizadas em todas as instruções SQL (SELECT, UPDATE e Delete).
▸ Seu funcionamento é bastante simples, consiste em realizar uma consulta e com os valores obtidos desta consulta realizar uma nova consulta, porém, sem que seja necessário executar dois processos individualmente
56
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > SUBCONSULTA
▸ IN: Faz com que a consulta principal afete somente os valores cujo a subconsulta retorna. É usado juntamente com a cláusula WHERE
▸ NOT IN: Faz o contrário da instrução IN, isto é, afeta somente os valores não retornados pela subconsulta.
57
SUBCONSULTA: O USO DO IN E NOT IN
SQL > LINGUAGEM DE CONSULTA DE DADOS > QUERY ELABORADA > SUBCONSULTA
▸ Usamos IN ou NOT IN quando as colunas a serem mostradas como resultado de uma consulta provém de uma tabela, mas a condição de seleção vem de outra.
Ex.: Listar o nome e identificador de todas as pessoas que realizaram acessos em uma determinada data.
SELECT nome, n_identificador FROM eventos_acessos WHERE id in (SELECT pessoa_id FROM eventos_acessos WHERE data = '2017-08-02')
‣ Estas instruções também são usadas quando queremos exibir uma coluna resultante de consulta que utiliza uma função SQL, mas que não é a coluna usada na função
Ex.: Listar somente os acessos cujo o valor da coluna valor_refeicao seja o maior existente.
SELECT * FROM eventos_acessos WHERE valor_refeicao = (SELECT MAX(valor_refeicao) FROM eventos_acessos)
58
QUANDO USAR IN OU NOT IN
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS
▸ Utilizada para criação de objetos dentro do SQL (tables, views, indexs, triggers e procedures)
▸ As instruções disponíveis são:
▸ Create: Usada para criar
▸ Drop: Usada para excluir
▸ Alter: Usada para alterar.
59
LINGUAGEM DE DEFINIÇÃO DE DADOS
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
TRIGGERS
▸ Triggers é um mecanismo de automatização de processos e procedimentos no banco de dados.
▸ É utilizada para N situações, as mais comuns são integrações via Banco de Dados e atualização de dados em tabelas (produtos e estoque, por exemplo), auditoria, etc.
60
+ INFO: https://msdn.microsoft.com/pt-BR/library/ms189799.aspx
CREATE TRIGGER <Nome da Trigger>ON <tabela que irá ser "observada">[AFTER | FOR | INSTEAD OF] <instrução sobre a tabela que irá disparar a trigger> ASBEGIN
<Instruções SQL>
END
61
Sintaxe básica:
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
CREATE TRIGGER TGR_FILTRO1_INSERTON filtro1AFTER INSERT ASBEGIN
DECLARE @descricao VARCHAR(100), @id INT
SELECT @descricao = descricao, @id = id FROM INSERTED
PRINT (CONCAT('Novos inseridos - ID:', @id , ' Descrição:' , @descricao))
END
62
Exemplo:
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
CREATE TRIGGER TGR_FILTRO1_DELETEON filtro1AFTER DELETE ASBEGIN
DECLARE @descricao VARCHAR(100), @id INT
SELECT @descricao = descricao, @id = id FROM DELETED
PRINT (CONCAT('Dados excluídos - ID:', @id , ' Descrição:' , @descricao))
END
63
Exemplo:
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
CREATE TRIGGER TGR_FILTRO1_UPDATEON filtro1AFTER UPDATE ASBEGIN
DECLARE @descricao VARCHAR(100), @id INT, @descricao_ant VARCHAR(100), @id_ant INT
SELECT @descricao_ant = descricao, @id_ant = id FROM DELETED
SELECT @descricao = descricao, @id = id FROM INSERTED
PRINT (CONCAT('Dados anteriores - ID:', @id_ant , ' Descrição:' , @descricao_ant))
PRINT (CONCAT('Novos dados - ID:', @id , ' Descrição:' , @descricao))
END
64
Exemplo:
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
65
No SQL Server, existem as "tabelas" INSERTED e DELETED que armazenam os valores que foram inseridos ou deletados da
tabela, isto é, através desta tabela é possível obter os valores de colunas em que a trigger foi criada.
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
CREATE TRIGGER TGR_FILTRO1_UPDATEON filtro1AFTER UPDATE ASBEGIN
DECLARE @descricao VARCHAR(100), @id INT, @descricao_ant VARCHAR(100), @id_ant INT
SELECT @descricao_ant = descricao, @id_ant = id FROM DELETED
SELECT @descricao = descricao, @id = id FROM INSERTED
PRINT (CONCAT('Dados anteriores - ID:', @id_ant , ' Descrição:' , @descricao_ant))
PRINT (CONCAT('Novos dados - ID:', @id , ' Descrição:' , @descricao))
END
66
Analisando o exemplo anterior...
} Aqui obtenho o valor anterior o novo valor das colunas id e descrição
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
IMPORTANTE:
Tecnicamente, o update consiste em deletar o registro anterior e recriar este com os novos valores.
Isso é feito pelo próprio SQL Server de maneira implícita.
Por isso, quando criamos uma trigger ON UPDATE, é necessário utilizar as tabelas DELETED e INSERTED.
67SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TRIGGERS
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE
TABLE
A criação de tabelas é um tema bastante extenso, pois, para isso é necessário conhecermos os tipos de dados existentes no SQL Server, para que possamos utilizar o tipo de dado correto para armazenar as informações desejada no banco de dados.
68
TIPOS DE DADOSOs tipos mais comuns são:
int: Usado para armazenar valores inteiros dentro do seguinte intervalo:
De -2³¹ (-2.147.483.648) a 2³¹ -1 (2.147.483.647)
smalldatetime: Usado para armazenar datas dentro do seguinte intervalo:
De 1º de janeiro de 1900 a 6 de junho de 2079
69SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE > TIPOS DE DADOS
TIPOS DE DADOS
char: Usado para armazenar cadeia de caracteres não Unicode de comprimento fixo.
varchar: Usado para armazenar cadeia de caracteres não Unicode de comprimento variável.
‣ Ambos permitem armazenar de 1 a 8000 caracteres.
70SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE > TIPOS DE DADOS
TIPOS DE DADOS
‣ Use char quando os tamanhos das entradas de dados de coluna são consistentes.
‣ Use varchar quando os tamanhos das entradas de dados de coluna variarem consideravelmente.
71SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE > TIPOS DE DADOS
TIPOS DE DADOS
Money: Usado para armazenar valores inteiros dentro do seguinte intervalo:
De -922.337.203.685.477,58 a 922.337.203.685.477,58
bit: Usado para armazenar valores do tipo Boolean (True ou False).
True é armazenado como 1.
False é armazenado como 0.
72SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE > TIPOS DE DADOS
TIPOS DE DADOS
‣ Existem muitos tipos de dados disponíveis, caberá a você escolher o que melhor se adequa ao que você deseja armazenar.
73
+ info: https://technet.microsoft.com/en-us/library/ms187752(v=sql.105).aspx
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE > TIPOS DE DADOS
SINTAXE BÁSICA
CREATE TABLE <nome da tabela>
(
nome_coluna1 tipo_dado(tamanho),
nome_coluna2 tipo_dado(tamanho),
nome_coluna3 tipo_dado(tamanho),
...
)
74SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE
SINTAXE BÁSICA
CREATE TABLE pessoas
(
id int,
nome varchar(100),
sobrenome varchar(100),
endereco varchar(255)
)
75SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE
SINTAXE BÁSICABanco de dados relacionais são orientados com base em referências entre tabelas, para isso, é necessário que exista chave primária e chave estrangeira.
76
CREATE TABLE a( id int PRIMARY KEY identity (1,1),
nome varchar(100),
sobrenome varchar(100),
endereco varchar(255))
O comando identity serve para que o controle do ID seja de responsabilidade do banco de dados
}
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE
EXEMPLO DE REFERENCIA ENTRE TABELAS:
77
CREATE TABLE a( id int PRIMARY KEY identity (1,1),
nome varchar(100),
sobrenome varchar(100),
endereco varchar(255))
CREATE TABLE b( id int PRIMARY KEY identity (1,1),
a_id int constraint FK_a
FOREIGN KEY REFEREBCES a(id),
outro_dado varchar(100),
obs varchar(255))
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > TABLE
SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > VIEW
VIEW
É uma “tabela virtual” cujo conteúdo é definido por uma query.
As principais vantagens de utilizar uma view são:
‣ Possibilitar restringir o acesso ao banco de dados;
‣ Para tornar simples consultas complexas;
‣ Para apresentar visões diferentes dos mesmos dados;
78
SINTAXE BÁSICA
CREATE VIEW <Nome da View>
AS
<Consulta SQL>
79SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > VIEW
EXEMPLO
CREATE VIEW Pessoas_DataAcesso
AS
SELECT p.nome, e.data FROM eventos_acessos e
JOIN pessoas p ON p.id = e.pessoa_id
80SQL > LINGUAGEM DE DEFINIÇÃO DE DADOS > VIEW
SQL > FONTE PARA CONSULTA
FONTE PARA CONSULTA
Tudo que vimos neste treinamento é apenas uma breve explanação sobre SQL, recomendo que releiam esta apresentação, façam os exercícios e consulte outras fontes, como por exemplo a W3Schools, segue link para a seção sobre SQL:
https://www.w3schools.com/sql
81