Conteúdo Programático
1. Sobre
a. Eu mesmo
2. Introdução ao SGBD e SQL
a. O que é SGBD?
b. O que é SQL?
c. Estrutura do SQL
d. Comandos DDL
e. Comandos DML
f. Comando DQL
i. Simples
ii. Where
iii. Order By
iv. Join
v. Union
vi. Aggregation Functions
vii. Group By
viii. Having
g. Views
3. Criação Banco de Dados - Curso
4. Indrodução a Linguagem Procedural
a. O que é T-SQL?
b. Triggers
c. Procedures
d. Functions
SGBD e SQL Page 1
Sobre Mim
Sérgio de Aguiar Valadão Junior
Bachelor’s degree in Data Process and System Analysis and post-graduate in MBA Project Manager.
For over 20 years I have been working as a systems analyst and software development. In this period, I had the opportunity to work
in both small and big companies. I have been offered all my knowledge and experience for clients in different kinds of industries
such as Chemicals, Mining, Pelletizing, Logistics, Steel, Cellulose and Paper, and Real State.
Expertise with system analysis and modeling, data modeling and analysis and software development. Related to the software
development skills, I would like to highlight .NET Framework, .NET Core, C#, ASP.NET Core MCV, Web API, HTML, CSS, Javascript,
Typescript, AJAX, ReactJS, Angular, MS SQL Server (including T-SQL), Oracle (Including PL/SQL), MySQL and PostgeSQL.
•
• •
• •
•
• •
•
•
•
•
SGBD e SQL Page 2
Introdução à Banco de Dados e SQL
Friday, September 29, 2023 3:49 PM
O Objetivo deste treinamento é fazer uma breve introdução de banco
de dados e ao SQL.
Apoiando programadores que estão iniciando suas carreiras no
desenvolvimento de sistemas.
SGBD e SQL Page 3
O que é Banco de Dados?
O que é dado?
Entende-se por dado, toda a informação que pode ser armazenada e que apresenta
algum significado dentro do contexto ao qual ele se aplica.
O que é Banco de Dados?
Um banco de dados ou base de dados (sua abreviatura é BD, em inglês DB, database)
são um conjuntos de dados com uma estrutura regular que tem como objetivo
organizar uma informação.
Um banco de dados normalmente agrupa informações utilizadas para um mesmo fim,
de forma que possam representar coleções de informações que se relacionam de
forma que façam sentido.
O que é SGBD?
Um banco de dados informatizado é usualmente mantido e acessado por
meio de um software conhecido como Sistema Gerenciador de Banco de Dados
(SGBD), que e muitas vezes o termo banco de dados é usado como sinônimo de
SGDB.
Um SGBD - Sistema de Gerenciamento de Banco de Dados é uma coleção de
programas que permitem ao usuário definir, construir e manipular Bases de Dados
para as mais diversas finalidades.
Curiosidade:
Durante a modelagem de um sistema é feita a modelagem de dados, que é
responsável pela criação da estrutura de dados eletrônica para representar um
conjunto de informações.
Essa estrutura de dados permite transformar os dados originais em vários tipos de
saídas como: formulários, relatórios, gráficos e etc.
O resultado da modelagem de dados é um diagrama chamado "Modelo de Dados"
ou "Modelo de Entidade Relacionamento."
Entende-se como entidade a estrutura em que os dados serão armazenados e se
relacionarão com outras entidades.
Após o modelo de dados pronto, é feita a implementação do banco de dados.
SGBD e SQL Page 4
Nota:
Falta definição dos tipos de dados, que também fazem parte do modelo de dados.
SGBD e SQL Page 5
O que é SQL?
SQL é o recurso mais conhecido por DBAs e programadores para a execução de
comandos em bancos de dados relacionais.
É por meio de SQL que criamos tabelas, colunas, índices, atribuímos permissões a
usuários, bem como realizamos consultas a dados.
É através da SQL que “conversamos” com o banco de dados.
A SQL facilita não apenas a execução de tarefas em SGBDs, mas também o diálogo
entre profissionais de banco de dados e programadores.
A Structured Query Language (SQL) passa a ser fundamental para qualquer um que
deseja atuar nessas áreas.
SGBD e SQL Page 6
Estrutura do SQL
A linguagem SQL é organizada em subconjuntos, cada um com seu
propósito bem definidos.
DQL - Linguagem de Consulta de Dados - Define o comando utilizado
para que possamos consultar (SELECT) os dados armazenados no
banco.
DML - Linguagem de Manipulação de Dados - Define os comandos
utilizados para manipulação de dados no banco (INSERT, UPDATE e
DELETE).
DDL - Linguagem de Definição de Dados - Define os comandos
utilizados para criação (CREATE) de tabelas, views, índices, atualização
dessas estruturas (ALTER), assim como a remoção (DROP).
DCL - Linguagem de Controle de Dados - Define os comandos
utilizados para controlar o acesso aos dados do banco, adicionando
(GRANT) e removendo (REVOKE) permissões de acesso.
DTL - Linguagem de Transação de Dados - Define os comandos
utilizados para gerenciar as transações executadas no banco de
dados, como iniciar (BEGIN) uma transação, confirmá-la (COMMIT) ou
desfazê-la (ROLLBACK).
SGBD e SQL Page 7
DDL - Data Definition Language*
Uma tarefa indispensável, porém realizada com menos frequência, é criar o banco de
dados e, em seguida, fazemos a criação das tabelas a ele relacionadas. Há também a
possibilidade de se alterar ou excluir uma tabela e ainda excluir o banco de dados como
um todo.
Os comandos DDL são destinados a essas tarefas.
Há um padrão para a sintaxe de cada comando e cada SGDB pode estender esse padrão
e personalizar seus comandos.
Criando um banco de dados
Para se criar um banco de dados, o comando a ser utilizado é:
CREATE DATABASE nome_do_banco_de_dados
Tipo de Dado Descrição
CHAR (n) Tipo de dados STRING com comprimento fixo (n > 0)
CHAR Um único caractere
Remover/Excluir um banco de dados
VARCHAR (n) Tipo de dados STRING com comprimento variável (n >
Para se excluir um banco de dados, o comando a ser utilizado é: 0)
BIT Valores True/False ou 0/1
DROP DATABASE nome_do_banco_de_dados NUMERIC ou Valor numérico constituído por n dígitos e sinal e com
d casas decimais
NUMERIC (n) ou …
NUMEROC (n,d) …
Criando uma tabela
DATETIME Um valor de data ou hora entre os anos 100 e 999
Para se criar uma tabela em um banco de dados, o comando utilizado é:
INTEGER ou INT Número Inteiro
SMALINT Inteiro Pequeno
Sintaxe FLOAT Nº de Dupla Precisão
CREATE TABLE nome_da_tabela ( DATE Apenas Data
campo1 Tipo [características], TIME Apenas Hora
campo2 Tipo [características],
campo3 Tipo [características])
Para execução do comando CREATE TABLE é necessário indicar qual o
nome da tabela e, para cada uma das colunas, o nome da coluna e o tipo de
dados.
No entanto, podem ser indicadas as características próprias de cada uma das
colunas, tais como por exemplo: Que valores podem admitir? Qual o valor
padrão? O campo representa um atributo identificador (chave primária)? O
campo pode ser nulo? O campo representa um atributo de outra tabla (chave
estrangeira)?
Uma caracteristica também é conhecida como constraint (palavra em inglês),
servem para garantir a integridade dos dados.
As constraints mais utilizadas/conhecidas são:
• Constraint NOT NULL
• Constraint CHECK
• Constraint UNIQUE
• Constraint PRIMARY KEY
• Constraint REFERENCES
• Constraint DEFAULT
Exemplos de criação de tabela:
SGBD e SQL Page 8
Exemplos de criação de tabela:
CREATE TABLE especialidades (
id INTERGER PRIMARY KEY,
nome varchar(50)
)
CREATE TABLE medicos
(
id INTERGER PRIMARY,
crm CHAR(15) NOT NULL UNIQUE,
nome CHAR(100) NOT NULL,
especialidade REFERENCES especialidades(id),
salario NUMERIC(9,2) NOT NULL CHECK(salario >=)
)
Também poderia ser criada desta forma:
CREATE TABLE medicos
CREATE TABLE pacientes ( (
id NUMERIC PRIMARY KEY NOT NULL, id INTEGER PRIMAY,
nome VARCHAR(60) NOT NULL, crm VARCHAR(15) NOT NULL,
idade INTEGER NOT NULL CHECK(Idade >= 18 AND Idade <= 150), Nome VARCHAR(100) NOT NULL,
sexo_biologico CHAR CHECK (SEXO IN('M','F') especialidade INTERGER
) )
ALTER TABLE medicos
ADD CONSTRAINT PK_MEDICOS
Alterando uma tabela PRIMARY KEY (id)
Uma tabela pode ser alterada a qualquer momento para:
ALTER TABLE medicos
Criar uma constraint ADD CONSTRAINT ix_crm UNIQUE (crm)
ALTER TABLE Nome_da_Table ADD CONSTRAINT Nome_da_Constraint ou
Tipo_Constraint Nome_da_Coluna Create UNIQUE index ix_crm on medicos(crm)
Adicionar coluna ALTER TABLE medicos
ALTER TABLE Nome_Da_Tabela ADD CONSTRAINT fk_especialidades_medicos
ADD Nome_Coluna Tipo_Coluna [características] FOREIGN KEY (especialidade)
REFERENCES especialidades(id);
Alterar Coluna
ALTER TABLE Nome_Da_Tabela
MODIFY Nome_Coluna Tipo_Coluna [características] ALTER TABLE medicos ADD salario NUMERIC(9,2) NOT
NULL
Remover Coluna
ALTER TABLE Nome_Da_Tabela ALTER TABLE medicos
DROP COLUMN Nome_Coluna ADD CONSTRAINT CHK_FUNCIONARIO_SALARIO
CHECK (SALARIO >= 0);
Excluir tabela
DROP TABLE nome_da_tabela
SGBD e SQL Page 9
Bonus: Índices
Um índice é um recurso muito importante quando o assunto é banco de Dicas para se criar índices:
dados.
Campos para serem indexados a fim de ganhar
De forma simples, podemos descrevê-lo como uma estrutura que visa desempenho:
reduzir o tempo gasto com consultas ao banco, facilitando a busca pelos • Chaves Primárias;
registros nas tablas. • Chaves Estrangeiras;
• Colunas acessadas por ranges (between);
Para simplificar a compreensão do que é um índice, basta lembramos de • Campos utilizados em group by ou order by;
um livro didático que lista todos os assuntos abordados pelo menos e
suas respectivas páginas. Assim, quando desejamos buscar por um Campos que não devem ser indexados:
assunto específico, através do índice localizamos facilmente. • Campos dos tipos: text, image, decimais;
• Campos calculados;
O mesmo acontece quando criamos índices para as tabelas do banco de • Campos com alta cardinalidade;
dados.
Criar índices para campos que compreendem uma
query que é utilizada com frequência. Nesse caso de
Sintaxe básica: um índice construído de modo que o SQL Server possa
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name satisfazer as consultas completamente lendo apenas o
ON( column [ ASC | DESC ] [ ,...n ] ) mesmo é chamado de índice de cobertura (covering
[ INCLUDE ( column_name [ ,...n ] ) ] indexes).
Criar índice clusterizado para campos de chave
primária com a propriedade identity.
Exemplo:
CREATE NONCLUSTERED INDEX IDX_UF ON clientes (UF ASC) Criar índice com colunas incluídas (Include)
INCLUDE(CEP)
No exemplo, com o índice criado, ao percorrer a tabela e encontrar o
valor para UF desejado, o campo CEP incluído não faz parte da indexação,
porém é utilizado para retornar sem necessidade de apontar para o
cluster, e desta forma se ganha maior desempenho.
Obs: O exemplo foi criado com o objetivo de demonstrar como se dá o
uso de índices com colunas incluídas, sem levar em consideração uma
real análise de desempenho.
SGBD e SQL Page 10
DML - Data Manipulation Language*
Para a manipulação de dados no banco, temos como comandos da linguagem SQL o
INSERT, UPDATE e DELETE, os quais inserem, atualizam e removem dados,
respectivamente.
Comando INSERT
Exemplo:
Utilizado para realizar a inclusão/inserção de dados em uma tabela do banco de INSERT INTO
dados. medicos (id, nome, crm, especialidade, salario
VALUES
INSERT INTO nome_da_tabela (lista-de-campos) (1, "HELBERT CARVALHO", '2580-ES', 9990.95)
VALUES (lista_dados)
--OU INSERT INTO
medicos (id, nome, crm, especialidade, 1,
salario
INSERT INTO nome_da_tabela VALUES (lista_dados)
VALUES
(2, "MIRANDA SILVEIRA", '2280-ES', 2,
9999.50)
Comando UPDATE
Este comando é utilizado para atualizar registros no banco de dados.
UPDATE nome_da_tabela SET
CAMPO = "novo_valor",
UPDATE medicos SET
CAMPO = "novo_valor" Nome = 'HELBERT CARVALHO JR.'
WHERE condição WHERE id = 1
A cláusula WHERE que impõe uma condição sobre a execução do comando.
A condição é muito importante, pois Se não for informada, a tabela inteira será
atualizada. DELETE FROM medicos WHERE id = 1
Normalmente a chave primária de uma table é utilizada como condição para
atualização de apenas um registro, uma vez que ela não é duplicada nos registros da
tabela.
Comando DELETE
É utilizado para excluir/apagar dados de uma tabela.
DELETE FROM nome_da_tabela
WHERE condição
A cláusula WHERE que impõe uma condição sobre a execução do comando.
Mesmas regras do UPDATE.
SGBD e SQL Page 11
DQL - Data Query Language*
Uma das tarefas mais corriqueiras em bancos de dados é a execução de queries
para recuperação de informações.
O comando SELECT é utilizado para recuperação de registros no banco de
dados. Ele também possue opções para ordenação de registros, funções de
agregação, junções, entre outros.
Portanto, saber criá-las da melhor maneira é muito importante para o Dica:
desempenho do banco e de aplicações que dele dependam.
Neste momento não se preocupe tanto com
Conhecendo o comando SELECT mais a fundo: eficiencia e performance das consultas/queries.
SELECT
[predicado { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2
[AS alias2] [, ...]]}
FROM
expressãotabela [, ...]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
Parte Descrição
predicado Um dos seguintes predicados: ALL, DISTINCT,
DISTINCTROW ou TOP. Você usa o predicado para
restringir o número de registros que retornam. Se nenhum
for especificado, o padrão será ALL.
* Especifica que todos os campos da tabela ou tabelas
especificadas são selecionados.
tabela O nome da tabela que contém os campos dos quais os
registros são selecionados.
campo1, campo2 Os nomes dos campos dos quais os dados serão
recuperados. Se você incluir mais de um campo, eles serão
recuperados na ordem listada.
alias1, alias2 Os nomes que serão usados como títulos de colunas em
vez dos nomes originais das colunas na tabela.
expressãotabela O nome da tabela ou tabelas contendo os dados que você
quer recuperar.
SGBD e SQL Page 12
Select Simples
O comando SELECT permite recuperar os dados de um objeto do Exemplo:
banco de dados, como uma tabela, view e, em alguns casos, uma
stored procedure (alguns bancos de dados permitem a criação de SELECT CODIGO, NOME, UF, ATIVO
FROM CLIENTES
procedimentos que retornam valor).
A sintaxe mais básica do comando é:
SELECT
<lista_de_campos>
FROM <nome_da_tabela>
SGBD e SQL Page 13
Select + Where
A cláusula WHERE permite ao comando SQL passar condições de Exemplos:
filtragem.
SELECT CODIGO, NOME, ATIVO
FROM CLIENTES
WHERE CODIGO = 10
A sintaxe mais básica do comando é:
SELECT CODIGO, NOME, ATIVO
SELECT FROM CLIENTES
<lista_de_campos> WHERE UF = 'RJ'
FROM <nome_da_tabela>
WHERE <CONDIÇÃO 1> SELECT CODIGO, NOME, ATIVO
FROM CLIENTES
[AND <CONDIÇÃO 2>] WHERE CODIGO >= 100 AND CODIGO <= 500
[OR <CONDIÇÃO 3>]
[AND (<CONDIÇÃO 4> OR/AND <CONDIÇÃO 5>)] SELECT CODIGO, NOME, ATIVO
FROM CLIENTES
WHERE UF = 'MG' OR UF = 'SP'
Os parênteses quando corretamente utilizados dão mais poder as
consultas. SELECT CODIGO, NOME, ATIVO
FROM CLIENTES
WHERE UF = 'RJ'
OR (UF = 'SP' AND ATIVO = 'N')
Filtro de Texto
Um campo de texto pode ser filtrado de forma total usando o
sinal de igualdade (=) ou parcialmente, utilizando a palavra-chave SELECT CODIGO, NOME, ATIVO
LIKE. FROM CLIENTES
WHERE (ENDERECO IS NULL)
OR (CIDADE IS NULL)
Através da palavra chave LIKE, é possível filtrar um texto que
comece com determinado texto, que termine com determinado
texto, ou que contenha determinado texto. SELECT CODIGO, NOME, ATIVO
FROM CLIENTES
Para filtrar um texto que comece com uma palavra, utilize LIKE WHERE NOME LIKE 'JOSÉ%'
"<palavra>%".
SELECT CODIGO, NOME, ATIVO
Para filtrar um texto que termine com uma palavra, utilize LIKE FROM CLIENTES
"%<palavra>". WHERE UPPER(NOME) LIKE 'JOSÉ %SILVA%'
Para filtrar um texto que contenha uma palavra, utilize LIKE
"%<palavra>%".
O uso de máscara no início e no fim da palavra, fornece maior
poder de busca. Mas, causa considerável perda de performance.
Este recurso deve ser utilizado com critério.
Uma observação: em alguns bancos de dados, a máscara de filtro
não é representada por %. Consulte a referência do banco para
verificar o caractere correto.
SGBD e SQL Page 14
verificar o caractere correto.
Por padrão, a SQL diferencia caixa baixa de caixa alta. Para
eliminar essa diferença, utiliza a função UPPER ou LOWER.
Consulte a referência do banco para conhecer suas funções
nativas.
SGBD e SQL Page 15
Select + Ordenação
Em uma consulta, o resultado pode ser ordenado para entregar uma Exemplos:
melhor relação de registros.
SELECT CODIGO, NOME, ATIVO
A ordenação pode ser definida com o comando ORDER BY. Assim FROM CLIENTES
WHERE UF = 'RJ'
como no comando WHERE, o campo de ordenação não precisa estar OR (UF = 'SP' AND ATIVO = 'N')
listado como campo de visualização ORDER BY NOME ASC
A ordenação pode ser realizada de forma ascendente e descendente. SELECT CODIGO, NOME, UF, ATIVO
Para ordenar de forma ascendente, utilizamos a palavra-chave ASC FROM CLIENTES
na frente do campo. WHERE ATIVO = 'S'
Já de forma descendente, utilizamos a palavra-chave DESC na frente ORDER BY NOME ASC, UF DESC
do campo.
Múltiplos campos podem ser utilizados na clausula ORDER BY, e
podem ter organizações diferentes. Isso significa que você pode
misturar ASC e DESC em uma mesma consulta.
Quando o tipo de ordenação não é indicado, por padrão é feita a
organização ascendente.
SGBD e SQL Page 16
Select + Junção de Tabelas
O SELECT permite juntar duas ou mais tabelas no mesmo Exemplos:
resultado. Junção é feita quando as tabelas são relacionadas,
com isso, o resultado trará informações completas e que fazem SELECT
complementação a informação inicial. C.CODIGO, C.NOME,
E.UF, E.BAIRRO, E.RUA, E.NUMERO
Isso pode ser feito de várias formas, a sintaxe mais básica do C.ATIVO
comando é:
FROM CLIENTES as C,
SELECT ENDERECOS as E
<tabela1.campo1>, tabela1.campo2>, <tabela2.campo1>,
<tabela2.campo2> … WHERE C.CODIGO = E.CLIENTE
FROM <tabela1>, <tabela2>
WHERE <tabela1.chave_primaria> = <tabela2.chave_estrangeira>
SELECT CLI.CODIGO, CLI.NOME,
PED.DATA, PED.VALOR,
Comando JOIN IT.QTD, D.DESCRICAO
A junção de tabelas no comando SELECT também pode ser FROM CLIENTES CLI,
realizada através do comando JOIN. PEDIDOS PED,
Este comando deve ser utilizado com a palavra-chave INNER ou ITENS IT,
OUTER: PRODUTOS PROD
WHERE CLI.CODIGO = PED.CLIENTE
- INNER: AND PED.CODIGO = IT.PEDIDO
Assim como acontece com o uso do operador “=” na junção de AND IT.PRODUTO = PROD.CODIGO
tabelas, os registros sem correspondências não são incluídos.
O uso da palavra-chave INNER é opcional e pode ser omitida no
comando JOIN.
- OUTER: SELECT
Diferentemente do INNER, a palavra-chave OUTER inclui em seu A.CODIGO, A.DESCRICAO,
resultado também os registros que não se relacionam nas outras B.DESCRICAO, B.QTD
tabelas. Ou seja, é possível definir qual tabela será incluída na FROM PRODUTOS A
seleção, mesmo não tendo correspondência relacionada. INNER JOIN COMPONENTES B
ON (A.CODIGO = B.PRODUTO)
A palavra-chave OUTER, deve indicar qual tabela terá seus
registros incluídos na seleção independente de possuírem SELECT A.CODIGO, A.DESCRICAO,
registros na tabela relação. B.DESCRICAO, B.QTDE
FROM PRODUTOS A
Palavra LEFT se refere à primeira tabela do relacionamento. LEFT OUTER JOIN COMPONENTES B
Palavra RIGHT se refere à segunda tabela do relacionamento. ON (A.CODIGO = B.CODPRODUTO)
Observar como ocorre o relacionamento entre as tabelas é SELECT A.CODIGO, A.DESCRICAO,
muitíssimo importante para se obter um resultado correto para a B.DESCRICAO
consulta e entregar informações confiáveis. FROM COMPONENTES A
RIGHT OUTER JOIN PRODUTOS B
FULL OUTER JOIN: ON (A.CODIGO = B.CODPRODUTO)
SGBD e SQL Page 17
consulta e entregar informações confiáveis. FROM COMPONENTES A
RIGHT OUTER JOIN PRODUTOS B
FULL OUTER JOIN: ON (A.CODIGO = B.CODPRODUTO)
Podemos ainda combinar o uso de INNER e OUTER através do
comando FULL OUTER JOIN. Neste caso, todos os registros das Nas queries acima o resultado será o
duas tabelas envolvidas serão exibidos, tendo ou não mesmo, note que as tabelas foram
relacionamento. invertidas.
SGBD e SQL Page 18
Select + Union
Através do parâmetro UNION, é possível juntar o conteúdo de duas Exemplo:
tabelas em um único resultado.
SELECT CODIGO, NOME, UF, ATIVO
FROM CLIENTES
Essa também pode ser considerada uma forma de juntar tabelas. UNION
SELECT CODIGO, NOME, UF, ATIVO
Sintaxe: FROM EMPREGADOS
SELECT <lista de campos> FROM <tabela1>
UNION
SELECT <mesma lista de campos> from <tabela2>
O Número de campos e seus tipos devem ser iguais em ambas as
consultas.
O resultado deste comando é a listagem de todos em um único
resultado. Repare que no comando JOIN á união é horizontal e no
UNION a união é vertical.
Por padrão, os registros duplicados/iguais serão eliminados na
cláusula UNION.
Para incluir todos os registros, independente de duplicidade, é
necessário utilizar a palavra ALL, conforme apresentado abaixo:
Sintaxe:
SELECT <lista de campos> FROM <tabela1>
UNION ALL
SELECT <mesma lista de campos> from <tabela2>
SGBD e SQL Page 19
Select + Aggregation Functions
O comando SELECT permite que realizamos algumas operações junto aos campos Exemplo:
de uma tabela.
Essas ações são conhecidas como funções de agregação, ou no inglês, aggregation SELECT COUNT(*) FROM CLIENTES
functions. SELECT MAX(ID) FROM CLIENTES
São cinco as funções básicas de agregação presentes no padrão ANSI. SELECT AVG(SALARIO) FROM FUNCIONARIOS
AVG:
Retorna a média do campo especificado
MIN/MAX/SUM
Respectivamente retorna o menor valor, o maior e o somatório de um grupo de
registros
COUNT
Retorna a quantidade de itens da seleção
SGBD e SQL Page 20
Select + Group By
Um poderoso recurso do comando SELECT é o clausula chamada GROUPY BY. Exemplo:
SELECT C.ID, C.NOME,
Através dela podemos retornar informações agrupadas de um conjunto de COUNT(P.ID), MAX(VALOR)
FROM CLIENTES as C
registros, estabelecendo uma condição de agrupamento. É um recurso muito INNER JOIN PEDIDOS as P
utilizado na criação de relatórios. on C.ID = P.CLIENTE
Where C.UF = 'RJ'
GROUP BY C.ID, C.NOME
A sintaxe mais básica do comando é:
SELECT
<campos>, <função de agregação>
FROM <nome_da_tabela>
GROUP BY <campos>
SGBD e SQL Page 21
Select + Having
Através do clausula HAVING podemos filtrar a cláusula GROUP BY. Exemplo:
Ou seja, o HAVING funciona da mesma forma que o clausula WHERE,
porém é aplicável somente quando o GROUP BY é utilizado na SELECT C.ID, C.NOME,
COUNT(P.ID) as NumeroPedidos,
consulta. MAX(VALOR) as MaiorValor
FROM CLIENTES as C
INNER JOIN PEDIDOS as P
A sintaxe mais básica do comando é: on C.ID = P.CLIENTE
SELECT Where C.UF = 'RJ'
<campos>, <função de agregação> GROUP BY C.ID, C.NOME
FROM <nome_da_tabela> HAVING COUND(P.ID) >= 5
GROUP BY <campos>
HAVING <condição>
SGBD e SQL Page 22
VIEWS
O que é VIEW?
Uma view, pode ser considerada como uma "tabela virtual" que agrupa os dados
desejados a partir de alguma consulta (SELECT).
Normalmente criamos views para facilitar a manipulação dos dados, pois com elas
podemos inserir em uma "visão/tabela" os dados que são necessários para algum tipo
de processamento, reduzindo a complexidade na construção de consultas e, ao
mesmo tempo, protegendo dados os dados reais.
As vantagens de se usar views são:
• Economizar tempo com retrabalho
Você não precisar escrever aquela instrução enorme todas as vezes. Faça um vez e
armazene-a.
• Associar vários domínios formando uma única entidade;
Podemos ter várias "JOIN" encapsuladas em uma view, formando somente uma
tabela arbitrariamente
• Velocidade de acesso às informações
Uma vez compilada, o seu conjunto de dados (dataset ou recordset) é
armazenado em uma tabela temporária (virtual).
• Mascarar complexidade do banco de dados
As views isolam do usuário a complexidade do banco de dados.
Nomes de domínios podem ser referenciados com literais e outros recursos. Isso
proporciona aos desenvolvedores a capacidade de alterar a estrutura sem afetar a
interação do usuário com o banco de dados.
• Simplifica o gerenciamento de permissão de usuários
Em vez de conceder permissão para que os usuários tenham acesso as tabelas da
base, os proprietários/administradores de bancos de dados podem simplesmente
conceder permissões através de views. Isso protege as alterações na estrutura e
dados das tabelas da base de dadis.
• Organizar os dados que poderão ser exportados para outros aplicativos
Pode-se criar uma view baseada em uma consulta complexa, que associe até 32
tabelas e depois exportar dados para outro aplicativo para análise adicional.
Criando uma VIEW Exemplo:
CREATE VIEW VolumeVendasPorEstado
As views segue as mesmas regras de criação de tabelas e outros objetos do banco de
(UF, NumeroPedidos, ValorPedidos)
dados. O seu nome deve ser único e de fácil identificação. SELECT C.ID, C.NOME,
COUNT(P.ID) as NumeroPedidos,
SUM(VALOR) as ValorPedidos
Sintaxe: FROM CLIENTES as C
CREATE VIEW<nome_da_view> INNER JOIN PEDIDOS as P
(<campo1>, <campo2>, <campo3>, etc…) on C.ID = P.CLIENTE
GROUP BY C.UF
AS
SELECT <campos a serem retornados>)
SGBD e SQL Page 23
(<campo1>, <campo2>, <campo3>, etc…) on C.ID = P.CLIENTE
GROUP BY C.UF
AS
SELECT <campos a serem retornados>)
FROM <tabela1> AS t1 INNER JOIN <tabela2> AS t2
ON t1.chave_primaria = t2.chave_estrangeira_de_t1
SGBD e SQL Page 24
Introdução ao T-SQL
A SQL é a linguagem padrão para lidarmos com bancos de dados. No entanto, alguns
SGBDs optaram por criar variações dessa para prover novas funcionalidades ou
aprimorar recursos oferecidos pela Structured Query Language.
Porém, ainda assim, apenas com o SQL não é possível atender a todas as necessidades
relacionadas ao contexto do banco de dados e, principalmente, a um dos principais
ativos de qualquer corporação, seus dados.
Diante disso, é comum que os principais players de banco de dados, a exemplo da
Microsoft e da Oracle, oferecem extensões à tão respeitada linguagem de consulta.
A Microsoft, com a T-SQL, e a Oracle, com a PL/SQL, fornecem, aos profissionais de
banco de dados, um vasto conjunto de recursos que possibilitam a criação dos mais
específicos procedimentos para atender às demandas de qualquer tipo de aplicação.
Com elas, torna-se possível não apenas a manipulação dos dados, mas também o
processamento dos mesmos, declarando, para isso, variáveis, estruturas de condição,
repetição, procedimentos, funções, entre varios outros recursos.
Para cobrir esse assunto, essas extensões, são categorizadas como Linguagens
Procedurais.
SGBD e SQL Page 25
O que é T-SQL?
Transact-SQL, ou simplesmente T-SQL, é a uma extensão da linguagem padrão SQL,
através dela a Microsoft oferece ao SQL Server, seu sistema de SGBD, a capacidade de
prover novas funcionalidades ou aprimorar recursos oferecidos pela SQL.
Além de implementar todas as opções existentes no padrão ANSI, a linguagem T-SQL
permite que o programador automatize processos, integre dados e otimize as
consultas realizadas em um banco de dados. Assim como, fornece os recursos para o
desenvolvedor trabalhar com variáveis, estruturas de condição, repetição,
procedimentos, funções, entre vários outros recursos no SQL Server.
Neste treinamento, daremos ênfase a criação de triggers, procedures e functions, que
são procedimentos armazenados muito utilizados em diversos tipos de aplicações.
Exemplo:
CREATE VIEW VolumeVendasPorEstado
(UF, NumeroPedidos, ValorPedidos)
SELECT C.ID, C.NOME,
COUNT(P.ID) as NumeroPedidos,
SUM(VALOR) as ValorPedidos
FROM CLIENTES as C
INNER JOIN PEDIDOS as P
on C.ID = P.CLIENTE
GROUP BY C.UF
SGBD e SQL Page 26
PROCEDURE
Um stored procedure, ou procedimento armazenado, ou simplesmente pela Exemplo:
USE [EMPRESADB]
abreviação SP, é um recurso que permite a execução de lógicas dentro do GO
banco de dados, de forma semelhante a um método ou função no código de
IF EXISTS (SELECT * FROM sys.objects WHERE object_id =
uma aplicação, mas escrito com a linguagem do banco de dados. OBJECT_ID(N'[dbo].[SP_S_CMES_RPT_MATERIAL_MASTER_RECIPE]') AND type
in (N'P', N'PC'))
Assim, ao invés de deixar toda a lógica na aplicação cliente, podemos trazer DROP PROCEDURE [dbo].[SP_S_CMES_RPT_MATERIAL_MASTER_RECIPE]
GO
parte dela para o servidor de banco de dados, o que, em muitos casos, pode
trazer ganhos de performance, ao evitar que dados precisem ser enviados pela USE [MESDB]
GO
rede para serem processados. SET ANSI_NULLS ON
GO
Eles armazenam tarefas repetitivas e aceita parâmetros de entrada para que a SET QUOTED_IDENTIFIER ON
tarefas sejam efetuadas de acordo com a necessidade individual do negocio. GO
--
*****************************************************************
*********************************************************
A sintaxe mais básica do comando é: -- Module Name -
CREATE PROCEDURE[NOME DA SP] [SP_S_CMES_RPT_MATERIAL_MASTER_RECIPE]
AS -- Description - Load dataset of Master Recipe
according to the entity and material number
--CÓDIGO DO TRIGGER -- Author - Sergio Valadão Jr.
-- Date Created - 10/29/2017
-- Version - 1.0.0
A sintaxe com parâmetros de entrada é: --
CREATE PROCEDURE [NOME DA SP] ----------------------------------------------------------------------------------------------------------
------------------
( -- Date_Modified Modified_By Ver
<parametro1> <datatype>, Changes
--
<parametro2> <datatype, ----------------------------------------------------------------------------------------------------------
) ------------------
--
AS *****************************************************************
--CÓDIGO DO TRIGGER ********************************************************
CREATE PROCEDURE [dbo].[SP_S_CMES_RPT_MATERIAL_MASTER_RECIPE]
@ent_name STRING40,
@item_id STRING40
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select attr_value as MASTER_RECIPE_ID from wo w, wo_attr wa, attr a,
job j
where w.wo_id = wa.wo_id
and wa.attr_id = a.attr_id
and w.wo_id = j.wo_id
and wa.attr_id = (select attr_id from attr where attr_desc = 'Master
Recipe ID')
and upper(substring(w.wo_id, 1,8)) = 'MESCLONE'
and j.oper_id = 'MES START'
and j.target_sched_ent_id = @ent_name
and w.item_id = @item_id
END
GO
SGBD e SQL Page 27
FUNCTIONS
Uma função definida pelo usuário é uma rotina Transact-SQL ou CLR Documentação oficial:
(Common Language Runtime) que aceita parâmetros, executa uma ação, Create User-defined Functions (Database Engine) - SQL Server | Microsoft Learn
como um cálculo complexo, e retorna o resultado dessa ação como um
valor. Limitações e Restrições:
• Funções definidas pelo usuário não podem ser usadas para executar
O valor de retorno pode ser um valor escalar (único) ou uma tabela. ações que modificam o estado do banco de dados.
• As funções definidas pelo usuário não podem conter uma
As funções definidas pelo usuário, podem ser utilizadas das seguintes cláusula OUTPUT INTO que tenha uma tabela como seu destino.
maneiras:
• As funções definidas pelo usuário não podem retornar vários conjuntos
• Em instruções Transact-SQL, como SELECT de resultados. Use um procedimento armazenado se precisar retornar
vários conjuntos de resultados.
• Em aplicativos que chamam a função
• O tratamento de erros é restringido em uma função definida pelo
usuário. Uma UDF não é compatível
• Na definição de outra função definida pelo usuário com TRY...CATCH, @ERROR ou RAISERROR.
• Para parametrizar uma exibição ou aprimorar a funcionalidade de • As funções definidas pelo usuário não podem chamar um procedimento
uma exibição indexada armazenado, mas podem chamar um procedimento armazenado
estendido.
• Para definir uma coluna em uma tabela
• As funções definidas pelo usuário não podem fazer uso de SQL dinâmico
ou tabelas temporárias. Variáveis de tabela são permitidas.
• Para definir uma restrição CHECK em uma coluna
• As instruções SET não são permitidas em uma função definida pelo
• Para substituir um procedimento armazenado usuário.
• Usar uma função embutida como um predicado de filtro para uma • A cláusula FOR XML não é permitida.
política de segurança • Funções definidas pelo usuário podem ser aninhadas, isto é, uma função
definida pelo usuário pode chamar outra. O nível de aninhamento é
incrementado quando a execução da função é iniciada, e reduzido
quando a execução da função chamada é concluída. Até 32 níveis de
Nosso foco será nas funções escalares (que retornam um unico valor funções definidas pelo usuário podem ser aninhados. Se o máximo de
como resultado) e nas funções tabelares (que retornam uma tabela níveis de aninhamento for excedido haverá falha em toda a cadeia de
como resultado). funções da chamada de aninhamento. Qualquer referência a um código
gerenciado de uma função definida pelo usuário do Transact-SQL é
contada como um nível em relação ao limite de 32 níveis de
Sintaxes: aninhamento. Os métodos invocados a partir do código gerenciado não
-- Transact-SQL Scalar Function Syntax são contados em relação a esse limite.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name • As seguintes instruções do Service Broker não podem ser incluídas na
( [ { @parameter_name [ AS ][ type_schema_name. ] definição de uma função Transact-SQL definida pelo usuário:
parameter_data_type [ NULL ] • BEGIN DIALOG CONVERSATION
• END CONVERSATION
[ = default ] [ READONLY ] } • GET CONVERSATION GROUP
[ ,...n ] • MOVE CONVERSATION
] • RECEIVE
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ] Exemplo:
[ AS ]
BEGIN IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[f
n_S_CMES_Split_List]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
function_body DROP FUNCTION [dbo].[fn_S_CMES_Split_List]
GO
RETURN scalar_expression SET ANSI_NULLS ON
GO
END SET QUOTED_IDENTIFIER ON
GO
[;] CREATE FUNCTION [dbo].[fn_S_CMES_Split_List]
(@string VARCHAR(8000)
) RETURNS @temptable TABLE (items varchar(8000))
AS
-- =============================================
-- Transact-SQL Multi-Statement Table-Valued Function Syntax -- Description: This function will split a CSV parameter
-- and return as a table
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name -- =============================================
BEGIN
( [ { @parameter_name [ AS ] [ type_schema_name. ] declare @idx int
declare @slice varchar(8000)
parameter_data_type [ NULL ]
select @idx = 1
[ = default ] [READONLY] } if len(@string)<1 or @String is null return
SGBD e SQL Page 28
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name BEGIN
( [ { @parameter_name [ AS ] [ type_schema_name. ] declare @idx int
declare @slice varchar(8000)
parameter_data_type [ NULL ]
select @idx = 1
[ = default ] [READONLY] } if len(@string)<1 or @String is null return
[ ,...n ] while @idx!= 0
BEGIN
] set @idx = charindex(',',@String)
) if @idx!=0
set @slice = left(@String,@idx - 1)
RETURNS @return_variable TABLE <table_type_definition> else
set @slice = @String
[ WITH <function_option> [ ,...n ] ]
if(len(@slice)>0)
[ AS ] insert into @temptable(items) values(@slice)
BEGIN set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
function_body END
RETURN
RETURN END
END GO
[;]
SGBD e SQL Page 29
SQL SERVER Built-in Functions
O SQL Server possui diversas funções internas que auxiliam imensamente na construção de SQL, Procedures,
Custom Functions e Triggers.
SQL Server String Functions
Function Description
ASCII Returns the ASCII value for the specific character
CHAR Returns the character based on the ASCII code
CHARINDEX Returns the position of a substring in a string
CONCAT Adds two or more strings together
Concat with + Adds two or more strings together
CONCAT_WS Adds two or more strings together with a separator
DATALENGTH Returns the number of bytes used to represent an expression
DIFFERENCE Compares two SOUNDEX values, and returns an integer value
FORMAT Formats a value with the specified format
LEFT Extracts a number of characters from a string (starting from left)
LEN Returns the length of a string
LOWER Converts a string to lower-case
LTRIM Removes leading spaces from a string
NCHAR Returns the Unicode character based on the number code
PATINDEX Returns the position of a pattern in a string
QUOTENAME Returns a Unicode string with delimiters added to make the string a valid SQL Server delimited identifier
REPLACE Replaces all occurrences of a substring within a string, with a new substring
REPLICATE Repeats a string a specified number of times
REVERSE Reverses a string and returns the result
RIGHT Extracts a number of characters from a string (starting from right)
RTRIM Removes trailing spaces from a string
SOUNDEX Returns a four-character code to evaluate the similarity of two strings
SPACE Returns a string of the specified number of space characters
STR Returns a number as string
STUFF Deletes a part of a string and then inserts another part into the string, starting at a specified position
SUBSTRING Extracts some characters from a string
TRANSLATE Returns the string from the first argument after the characters specified in the second argument are
translated into the characters specified in the third argument.
TRIM Removes leading and trailing spaces (or other specified characters) from a string
UNICODE Returns the Unicode value for the first character of the input expression
UPPER Converts a string to upper-case
SQL Server Math/Numeric Functions
Function Description
ABS Returns the absolute value of a number
ACOS Returns the arc cosine of a number
ASIN Returns the arc sine of a number
ATAN Returns the arc tangent of a number
ATN2 Returns the arc tangent of two numbers
AVG Returns the average value of an expression
CEILING Returns the smallest integer value that is >= a number
SGBD e SQL Page 30
COUNT Returns the number of records returned by a select query
COS Returns the cosine of a number
COT Returns the cotangent of a number
DEGREES Converts a value in radians to degrees
EXP Returns e raised to the power of a specified number
FLOOR Returns the largest integer value that is <= to a number
LOG Returns the natural logarithm of a number, or the logarithm of a number to a specified base
LOG10 Returns the natural logarithm of a number to base 10
MAX Returns the maximum value in a set of values
MIN Returns the minimum value in a set of values
PI Returns the value of PI
POWER Returns the value of a number raised to the power of another number
RADIANS Converts a degree value into radians
RAND Returns a random number
ROUND Rounds a number to a specified number of decimal places
SIGN Returns the sign of a number
SIN Returns the sine of a number
SQRT Returns the square root of a number
SQUARE Returns the square of a number
SUM Calculates the sum of a set of values
TAN Returns the tangent of a number
SQL Server Date Functions
Function Description
CURRENT_TIMESTAMP Returns the current date and time
DATEADD Adds a time/date interval to a date and then returns the date
DATEDIFF Returns the difference between two dates
DATEFROMPARTS Returns a date from the specified parts (year, month, and day values)
DATENAME Returns a specified part of a date (as string)
DATEPART Returns a specified part of a date (as integer)
DAY Returns the day of the month for a specified date
GETDATE Returns the current database system date and time
GETUTCDATE Returns the current database system UTC date and time
ISDATE Checks an expression and returns 1 if it is a valid date, otherwise 0
MONTH Returns the month part for a specified date (a number from 1 to 12)
SYSDATETIME Returns the date and time of the SQL Server
YEAR Returns the year part for a specified date
SQL Server Advanced Functions
Function Description
CAST Converts a value (of any type) into a specified datatype
COALESCE Returns the first non-null value in a list
CONVERT Converts a value (of any type) into a specified datatype
CURRENT_USER Returns the name of the current user in the SQL Server database
IIF Returns a value if a condition is TRUE, or another value if a condition is FALSE
ISNULL Return a specified value if the expression is NULL, otherwise return the expression
ISNUMERIC Tests whether an expression is numeric
NULLIF Returns NULL if two expressions are equal
SESSION_USER Returns the name of the current user in the SQL Server database
SESSIONPROPERTY Returns the session settings for a specified option
SYSTEM_USER Returns the login name for the current user
SGBD e SQL Page 31
SYSTEM_USER Returns the login name for the current user
USER_NAME Returns the database user name based on the specified id
SGBD e SQL Page 32
TRIGGERS
O que é Trigger? TABELA: CAIXA
DATA DATETIME PK
SALDO DECIMAL(10,2) Not null
Um trigger, ou gatilho, é um tipo de stored procedure (SP) que é chamado toda vez
OBSERVACAO VARCHAR(100)
que um evento a ele relacionado acontece, normalmente alterações nos dados de
uma tabela do banco por meio de operações de inserção, exclusão e atualização de TABELA: VENDAS
dados (insert, delete e update). CODIGO INT PK
DATA DATETIME Not Null
Assim, é comum utilizar triggers quando o objetivo é manter a consistência de dados
ou fazer alguma auditoria, por exemplo. O uso desse recurso é observado em códigos
Saldo Inicial do Caixa:
de definição (DDL) e manipulação (DML) de dados. INSERT INTO CAIXA
VALUES (SYSDATETIME(), 0.00, 'SALDO INICIAL')
Para criar um trigger, utilizamos o comando CREATE TRIGGER.
Já para sua remoção, o comando utilizado é DROP TRIGGER.
Trigger For Insert:
CREATE TRIGGER TGR_VENDAS_AI
Sintaxe básica: ON VENDAS
CREATE TRIGGER [NOME DO TRIGGER] FOR INSERT
AS
ON [NOME DA TABELA] BEGIN
[FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE] DECLARE @VALOR DECIMAL(10,2),
@CODIGO INT,
AS @SALDO_ANTERIOR DECIMAL(10,2)
--CÓDIGO DO TRIGGER
SELECT @CODIGO = CODIGO, @VALOR = VALOR
FROM INSERTED
SELECT TOP 1 @SALDO_ANTERIOR = SALDO
O entendimento de toda essa sintaxe, bem como do funcionamento dos triggers, é de FROM CAIXA
suma importância para o desenvolvimento de um trigger funcional e que realmente ORDER BY DATA DESC
irá agregar valor ao negócio. Então vamos entender os parâmetros da sintaxe: INSERT INTO CAIXA
VALUES (SYSDATETIME(),
@SALDO_ANTERIOR + @VALOR,
NOME DO TRIGGER 'PEDIDO: ' || CONVERT(VARCHAR, @CODIGO)
)
nome que identificará o gatilho como objeto do banco de dados. Deve seguir as regras
básicas de nomenclatura de objetos e ser único.
END
GO
NOME DA TABELA
tabela à qual o gatilho estará ligado, para ser disparado mediante ações de insert, Trigger for Delete:
update ou delete. CREATE TRIGGER TGR_VENDAS_AD
ON VENDAS
FOR DELETE
FOR/AFTER/INSTEAD OF AS
BEGIN
uma dessas opções deve ser escolhida para definir o momento em que o trigger será DECLARE
disparado, sendo: @VALOR DECIMAL(10,2),
FOR é o valor padrão e faz com o que o gatilho seja disparado junto da ação. @CODIGO INT,
@SALDO_ANTERIOR DECIMAL(10,2)
AFTER faz com que o disparo se dê somente após a ação que o gerou ser concluída.
INSTEAD OF faz com que o trigger seja executado no lugar da ação que o gerou. SELECT @CODIGO = CODIGO , @VALOR = VALOR
FROM DELETED
INSERT/UPDATE/DELETE SELECT TOP 1 @SALDO_ANTERIOR = SALDO
FROM CAIXA
uma ou várias dessas opções (separadas por vírgula) devem ser indicadas para ORDER BY DATA DESC
informar ao banco qual é a ação que disparará o gatilho.
INSERT INTO CAIXA
VALUES (SYSDATETIME(),
CÓDIGO DO TRIGGER @SALDO_ANTERIOR - @VALOR,
'EXCLUSÃO DO PEDIDO: ' || CONVERT(VARCHAR,
Lógica que será executada pelo trigger. @CODIGO)
)
END
GO
SGBD e SQL Page 33
Criação Banco de Dados - Curso
SGBD e SQL Page 34