Apostila SQL Server
Apostila SQL Server
MÓDULO 01 MÓDULO 08
MÓDULO 02 MÓDULO 09
MÓDULO 03 MÓDULO 10
MÓDULO 04 MÓDULO 11
MÓDULO 05 MÓDULO 12
MÓDULO 06 MÓDULO 13
MÓDULO 07
MÓDULO 14 MÓDULO 20
MÓDULO 15 MÓDULO 21
MÓDULO 16 MÓDULO 22
MÓDULO 17 MÓDULO 23
MÓDULO 18 MÓDULO 24
MÓDULO 19 MÓDULO 25
MÓDULO 1
Porém, para extrair o melhor de um dado, não basta tê-lo, é preciso organizá-lo para então entendê-lo.
Imagina que você curta uma determinada foto no Instagram, como a foto
mostrada ao lado.
Pra você, pra mim e para qualquer outro usuário comum do aplicativo se
trata de uma mera curtida em uma foto...
Uma vez que você curte a publicação ao lado, o Instagram passa a ter um
dado muito importante sobre você: você gosta de cachorros. Com esse dado,
ou seja, com essa informação, o Instagram vai começar a mostrar a você mais
fotos de cachorros. E se você continuar curtindo essas fotos, o Instagram vai
mostrar mais e mais fotos de cachorros para você, até chegar a um ponto de
você se perguntar “uau, como o Instagram sabe que eu gosto de cachorros?”
Vamos então tentar entender o que é um Banco de Dados de uma maneira bem simples. Imagine a imagem abaixo. Um
dado carrega consigo alguma informação. Quando temos vários dados, precisamos organizar em uma tabela. E quando
temos várias tabelas, temos um banco de dados.
• 1 Compra online • Diversas compras online • Informações de compras online, usuários, etc
• 1 transferência bancária • Diversas transferência • Informações de contas bancárias, histórico de
• 1 curtida em uma foto do bancárias transferências, dados dos usuários, etc
Instagram • Diversas curtidas em fotos do • Curtidas em fotos, informações de
Instagram preferências dos usuários, informações dos
perfis de usuários, etc
O que é um banco de dados?
Com os dados bem organizados e estruturados, o Instagram será capaz de melhorar a experiência de cada usuário do
aplicativo, mostrando temas mais relevantes de acordo com as preferências de cada usuário.
Bancos de dados são conjuntos de tabelas, com alguma relação entre si, com
dados sobre pessoas, lugares ou coisas.
Para que isso seja possível, é necessário algum sistema de banco de dados para manipular todas essas informações.
E quem vai permitir que a gente consiga buscar todos esses dados em bancos de dados, adicionar novos dados, excluir
esses dados e atualizar esses dados é o SQL.
O SQL é uma linguagem padrão para trabalhar com bancos de dados relacionais. Será através do SQL que seremos
capazes de consultar e manipular os dados dos nossos bancos de dados.
SQL significa: “Structured Query Language”. Se trata de uma linguagem de programação que permite a manipulação
dos dados em um banco de dados.
O que é o SQL?
O SQL é uma linguagem que muitos profissionais acabam precisando aprender: seja quem usa Excel de forma pesada e
acaba migrando as informações para um Banco de Dados, seja um cientista de dados que usa o Python para agregar os
dados das diferentes fontes de informação.
Um SGBD permite ao desenvolvedor trabalhar com diferentes tabelas de um banco de dados através de uma interface.
Essa interface seria basicamente um programa que nos permite fazer a leitura de tabelas de um banco de dados e utilizar
o SQL para manipular esses dados, tudo de uma maneira bem visual e user-friendly.
um servidor, onde vamos conseguir uma interface amigável que nos permite
armazenar os nossos bancos de dados. escrever os códigos em SQL para acessar
os bancos de dados.
Sistemas de Gerenciamento de Bancos de Dados
E o que dizer sobre o Excel e o
Access?
É importante que fique claro que todos esses SGBDs utilizam o SQL como linguagem de programação.
Para você entender a diferença entre estes termos, imagine que você queira
aprender a se comunicar com outras pessoas. Você vai concordar que o
alfabeto é muito importante para esse objetivo, certo? Mas de nada serve o
alfabeto se não tivermos um local onde podemos combinar essas letras e
formar palavras que permitam a comunicação.
Por isso, além do alfabeto, precisamos também de um lugar para escrever as AbCDef
palavras: pode ser uma folha de papel, um caderno, o nosso celular, um
G H I J k L
computador, e assim vai. mnOpQrST
uvXwyZ
A nossa decisão então não será entre aprender o alfabeto ou usar uma folha
de papel, ou aprender o alfabeto ou usar um caderno. O alfabeto será
importante em qualquer situação: ele é a base da nossa comunicação.
SQL vs. MySQL, SQL Server, Oracle e PostgreSQL
Fazendo um paralelo com o SQL, o SQL é como se fosse o nosso alfabeto, e os diferentes SGBDs serão os lugares onde
conseguiremos escrever esses códigos em SQL para acessar nossos bancos de dados.
Por isso, a pergunta correta não é: aprender SQL ou MySQL? E sim, qual sistema de gerenciamento de banco de dados
usar: MySQL, SQL Server, Oracle ou PostgreSQL? O SQL você vai precisar aprender em qualquer um dos casos.
No entanto, o SQL possui algumas vertentes que dependem de cada sistema de gerenciamento de banco de dados: cada
SGBD incorpora à linguagem algumas funcionalidades e recursos extras.
Apesar de algumas diferenças, a base para todas as demais variantes do SQL seguem uma lógica semelhante, mas vale a
pena entender que elas existem e que, caso você ouça por ai, você entenda minimamente sobre cada uma delas.
SQL, T-SQL, PL-SQL e PL-pgSQL: do que se tratam?
Abaixo, um resumo de cada uma
dessas variações. T-SQL
1 TSQL, ou T-SQL (abreviação de Transaction-SQL), é uma versão
aprimorada do SQL que contém algumas extensões. O TSQL foi
originalmente desenvolvido pela Sybase e agora é propriedade da
Microsoft.
PL-pgSQL
3
integradas. T-SQL também é considerado mais fácil e simples de
entender, enquanto PL-SQL incorpora maior complexidade.
O motivo para aprender SQL é simples: garantir uma maior versatilidade no conhecimento e ser um profissional
diferenciado e requisitado no mercado.
A seguir, listamos algumas áreas que precisam manipular um alto volume de dados, e consequentemente precisarão de
sistemas de bancos de dados para auxiliar neste trabalho.
Por que aprender SQL?
Setor financeiro
Apps de banco, sistemas de pagamento e empresas de Redes sociais
investimento Facebook, Instagram, Linkedin, TikTok
Data science
Setor de energia
Data Science, ou Ciência de Dados, é uma área voltada
para o estudo e análise de dados econômicos, financeiros e O setor de energia é uma área com muitas oportunidades no
sociais, com o objetivo de chegar ao conhecimento de algo. mercado, envolvendo empresas de geração, transmissão,
Já é de se esperar que essa é uma das áreas que mais distribuição e comercialização de energia.
necessita de um bom gerenciamento dos dados. Imagine o volume de dados que este setor precisa manipular.
Sem bancos de dados bem estruturados, não seria algo viável.
Introdução ao SQL
O QUE VEREMOS NESTE MÓDULO
MÓDULO 3
O comando SELECT
O SELECT é um comando para selecionar dados de uma tabela.
Retorna valores
Nenhum valor
repetidos!
repetido!
Comentando o código
Comentários são uma boa prática para garantir um (1) O -- comenta linha por linha do código
bom entendimento de um código.
Já na opção 2), utilizamos uma barra seguida de um (2) O /* ... */ comenta mais de 1 linha por vez
asterisco para identificar onde começa um comentário,
e utilizamos o asterisco seguido de uma barra para
identificar onde termina um comentário.
EXERCÍCIOS 1
Questão 1
Você é responsável por controlar os dados de clientes e de produtos da
sua empresa. O que você precisará fazer é confirmar se:
Questão 2
2 Você trabalha no setor de marketing da empresa Contoso e acaba de ter
uma ideia de oferecer descontos especiais para os clientes no dia de
seus aniversários. Para isso, você vai precisar listar todos os clientes e as
suas respectivas datas de nascimento, além de um contato.
EXERCÍCIOS 3
Questão 3
A Contoso está comemorando aniversário de inauguração de 10 anos e
pretende fazer uma ação de premiação para os clientes. A empresa quer
presentear os primeiros clientes desde a inauguração.
Você foi alocado para levar adiante essa ação. Para isso, você terá que
fazer o seguinte:
EXERCÍCIOS 4 Questão 4
A empresa Contoso precisa fazer contato com os fornecedores de
produtos para repor o estoque. Você é da área de compras e precisa
descobrir quem são esses fornecedores.
Questão 5
5 O seu trabalho de investigação não para. Você precisa descobrir se
existe algum produto registrado na base de produtos que ainda não
tenha sido vendido. Tente chegar nessa informação.
Obs: caso tenha algum produto que ainda não tenha sido vendido, você
não precisa descobrir qual é, é suficiente saber se teve ou não algum
produto que ainda não foi vendido.
INTRODUÇÃO AO SQL
GABARITOS
Questão 1
1 Você é responsável por controlar os dados de clientes e de produtos da
sua empresa. O que você precisará fazer é confirmar se:
GABARITOS
Questão 2
2 Você trabalha no setor de marketing da empresa Contoso e acaba de ter
uma ideia de oferecer descontos especiais para os clientes no dia de
seus aniversários. Para isso, você vai precisar listar todos os clientes e as
suas respectivas datas de nascimento, além de um contato.
GABARITOS
Questão 3
3 A Contoso está comemorando aniversário de inauguração de 10 anos e pretende
fazer uma ação de premiação para os clientes. A empresa quer presentear os
primeiros clientes desde a inauguração.
Você foi alocado para levar adiante essa ação. Para isso, você terá que fazer o
seguinte:
GABARITOS
Questão 3
3 A Contoso está comemorando aniversário de inauguração de 10 anos e pretende
fazer uma ação de premiação para os clientes. A empresa quer presentear os
primeiros clientes desde a inauguração.
Você foi alocado para levar adiante essa ação. Para isso, você terá que fazer o
seguinte:
GABARITOS
Questão 3
3 A Contoso está comemorando aniversário de inauguração de 10 anos e pretende
fazer uma ação de premiação para os clientes. A empresa quer presentear os
primeiros clientes desde a inauguração.
Você foi alocado para levar adiante essa ação. Para isso, você terá que fazer o
seguinte:
c. Adapte o código do item a) para retornar apenas as 100 primeiras linhas, mas
apenas as colunas FirstName, EmailAddress, BirthDate.
INTRODUÇÃO AO SQL
GABARITOS
Questão 3
3 A Contoso está comemorando aniversário de inauguração de 10 anos e pretende
fazer uma ação de premiação para os clientes. A empresa quer presentear os
primeiros clientes desde a inauguração.
Você foi alocado para levar adiante essa ação. Para isso, você terá que fazer o
seguinte:
c. Adapte o código do item a) para retornar apenas as 100 primeiras linhas, mas
apenas as colunas FirstName, EmailAddress, BirthDate.
GABARITOS
Questão 4
4 A empresa Contoso precisa fazer contato com os fornecedores de
produtos para repor o estoque. Você é da área de compras e precisa
descobrir quem são esses fornecedores.
GABARITOS
Questão 5
5 O seu trabalho de investigação não para. Você precisa descobrir se
existe algum produto registrado na base de produtos que ainda não
tenha sido vendido. Tente chegar nessa informação.
Obs: caso tenha algum produto que ainda não tenha sido vendido, você
não precisa descobrir qual é, é suficiente saber se teve ou não algum
produto que ainda não foi vendido. Existe 1 produto que está
registrado na tabela DimProduct e que não foi vendido.
MÓDULO 4
Ordenando e filtrando
dados
O QUE VEREMOS NESTE MÓDULO
MÓDULO 4
ORDER BY: Ordenando uma tabela
O ORDER BY é usado para ordenar os valores de uma tabela em ordem crescente ou decrescente.
Por padrão, o ORDER BY ordena os dados em ordem crescente (ASC). Para ordenar de forma decrescente, usamos o DESC.
-- Exemplo 1: Selecione as 100 primeiras linhas da tabela DimStore e ordene de acordo com a coluna de quantidade de funcionários
ORDER BY: Ordenando uma tabela
Também é possível ordenar uma tabela por uma coluna de textos.
-- Exemplo 2: Selecione as 100 primeiras linhas da tabela DimStore e ordene de acordo com a coluna de StoreName
ORDER BY: Ordenando uma tabela
Também é possível ordenar uma tabela por mais de uma coluna.
-- Exemplo 3: Selecione as 100 primeiras linhas da tabela dimProduct e ordene de acordo com as coluna de UnitCost (DESC) e Weight (ASC)
WHERE …LIKE: Um filtro especial
O LIKE é usado em conjunto com o WHERE para procurar por um determinado padrão em uma coluna.
Exemplos:
WHERE …AND, OR e NOT: Filtrar por mais de uma condição
O comando WHERE pode ser combinado com os operadores AND, Exemplos:
OR e NOT.
-- Seleciona todas as linhas da tabela em que a marca é Contoso E a
cor é Prata.
Os operadores AND e OR são usados para filtrar linhas da tabela
baseado em mais de uma condição. SELECT * FROM dimProduct
Exemplos: Exemplos:
O BETWEEN é inclusivo: ou seja, os valores dos extremos (valor inicial e valor final) também são incluídos no intervalo.
Exemplos:
WHERE …IS (NOT) NULL: Filtrando valores vazios
Podemos encontrar valores nulos (em branco) em uma tabela. Para filtrar esses valores, podemos usar os comandos IS NULL ou IS NOT
NULL.
Exemplos: Exemplos:
ORDENANDO E FILTRANDO
EXERCÍCIOS 1
Questão 1
Você é o gerente da área de compras e precisa criar um relatório com as
TOP 100 vendas, de acordo com a quantidade vendida. Você precisa
fazer isso em 10min pois o diretor de compras solicitou essa informação
para apresentar em uma reunião.
Utilize seu conhecimento em SQL para buscar essas TOP 100 vendas, de
acordo com o total vendido (SalesAmount).
Questão 2
2 Os TOP 10 produtos com maior UnitPrice possuem exatamente o
mesmo preço. Porém, a empresa quer diferenciar esses preços de
acordo com o peso (Weight) de cada um.
EXERCÍCIOS 3
Questão 3
Você é responsável pelo setor de logística da empresa Contoso e precisa
dimensionar o transporte de todos os produtos em categorias, de
acordo com o peso.
Faça uma consulta no banco de dados para descobrir quais são estes
produtos que estão na categoria A.
EXERCÍCIOS 4
Questão 4
Você foi alocado para criar um relatório das lojas registradas
atualmente na Contoso.
5 Questão 5
O gerente da área de controle de qualidade notificou à Contoso que
todos os produtos Home Theater da marca Litware, disponibilizados
para venda no dia 15 de março de 2009, foram identificados com
defeitos de fábrica.
O que você deverá fazer é identificar os ID’s desses produtos e
repassar ao gerente para que ele possa notificar as lojas e
consequentemente solicitar a suspensão das vendas desses produtos.
ORDENANDO E FILTRANDO
EXERCÍCIOS 6
Questão 6
Imagine que você precise extrair um relatório da tabela DimStore, com
informações de lojas. Mas você precisa apenas das lojas que não estão
mais funcionando atualmente.
b. Agora imagine que essa coluna de Status não existe na sua tabela.
Qual seria a outra forma que você teria de descobrir quais são as
lojas que não estão mais funcionando.
7 Questão 7
De acordo com a quantidade de funcionários, cada loja receberá uma
determinada quantidade de máquinas de café. As lojas serão divididas
em 3 categorias:
Identifique, para cada caso, quais são as lojas de cada uma das 3
categorias acima (basta fazer uma verificação).
ORDENANDO E FILTRANDO
EXERCÍCIOS 8
Questão 8
A empresa decidiu que todos os produtos LCD receberão um super
desconto no próximo mês. O seu trabalho é fazer uma consulta à tabela
DimProduct e retornar os ID’s, Nomes e Preços de todos os produtos
LCD existentes.
Questão 9
9 Faça uma lista com todos os produtos das cores: Green, Orange, Black,
Silver e Pink. Estes produtos devem ser exclusivamente das marcas:
Contoso, Litware e Fabrikam.
Questão 10
10 A empresa possui 16 produtos da marca Contoso, da cor Silver e com
um UnitPrice entre 10 e 30. Descubra quais são esses produtos e
ordene o resultado em ordem decrescente de acordo com o preço
(UnitPrice).
ORDENANDO E FILTRANDO
GABARITOS
Questão 1
1 Você é o gerente da área de compras e precisa criar um relatório com as
TOP 100 vendas, de acordo com a quantidade vendida. Você precisa
fazer isso em 10min pois o diretor de compras solicitou essa informação
para apresentar em uma reunião.
Utilize seu conhecimento em SQL para buscar essas TOP 100 vendas, de
acordo com o total vendido (SalesAmount).
ORDENANDO E FILTRANDO
GABARITOS
Questão 2
2 Os TOP 10 produtos com maior UnitPrice possuem exatamente o
mesmo preço. Porém, a empresa quer diferenciar esses preços de
acordo com o peso (Weight) de cada um.
GABARITOS
Questão 3
3 Você é responsável pelo setor de logística da empresa Contoso e precisa
dimensionar o transporte de todos os produtos em categorias, de
acordo com o peso.
Faça uma consulta no banco de dados para descobrir quais são estes
produtos que estão na categoria A.
GABARITOS
Questão 4
4 Você foi alocado para criar um relatório das lojas registradas
atualmente na Contoso.
GABARITOS
5 Questão 5
O gerente da área de controle de qualidade notificou à Contoso que
todos os produtos Home Theater da marca Litware, disponibilizados
para venda no dia 15 de março de 2009, foram identificados com
defeitos de fábrica.
O que você deverá fazer é identificar os ID’s desses produtos e
repassar ao gerente para que ele possa notificar as lojas e
consequentemente solicitar a suspensão das vendas desses produtos.
ORDENANDO E FILTRANDO
GABARITOS
Questão 6
6 Imagine que você precise extrair um relatório da tabela DimStore, com
informações de lojas. Mas você precisa apenas das lojas que não estão
mais funcionando atualmente.
b. Agora imagine que essa coluna de Status não existe na sua tabela.
Qual seria a outra forma que você teria de descobrir quais são as
lojas que não estão mais funcionando.
ORDENANDO E FILTRANDO
GABARITOS
7 Questão 7
De acordo com a quantidade de funcionários, cada loja receberá uma
determinada quantidade de máquinas de café. As lojas serão divididas
em 3 categorias:
Identifique, para cada caso, quais são as lojas de cada uma das 3
categorias acima (basta fazer uma verificação).
ORDENANDO E FILTRANDO
GABARITOS
Questão 8
8 A empresa decidiu que todos os produtos LCD receberão um super
desconto no próximo mês. O seu trabalho é fazer uma consulta à tabela
DimProduct e retornar os ID’s, Nomes e Preços de todos os produtos
LCD existentes.
ORDENANDO E FILTRANDO
GABARITOS
Questão 9
9 Faça uma lista com todos os produtos das cores: Green, Orange, Black,
Silver e Pink. Estes produtos devem ser exclusivamente das marcas:
Contoso, Litware e Fabrikam.
ORDENANDO E FILTRANDO
GABARITOS
Questão 10
10 A empresa possui 16 produtos da marca Contoso, da cor Silver e com
um UnitPrice entre 10 e 30. Descubra quais são esses produtos e
ordene o resultado em ordem decrescente de acordo com o preço
(UnitPrice).
MÓDULO 5
Funções de Agregação
O QUE VEREMOS NESTE MÓDULO
MÓDULO 5
COUNT: Contando valores em uma tabela
A função COUNT() retorna a quantidade de linhas de uma coluna. É possível fazer uma contagem e especificar um determinado critério.
COUNT+DISTINCT: Contando valores distintos
Podemos usar o COUNT() combinado com o
DISTINCT() para fazer uma contagem distinta dos
valores de uma coluna.
SUM: Somando os valores de uma coluna
Para retornar a soma total de uma determinada coluna,
usamos o SUM().
EXERCÍCIOS 1
Questão 1
O gerente comercial pediu a você uma análise da Quantidade Vendida e
Quantidade Devolvida para o canal de venda mais importante da
empresa: Store.
Utilize uma função SQL para fazer essas consultas no seu banco de
dados. Obs: Faça essa análise considerando a tabela FactSales.
Questão 2
2 Uma nova ação no setor de Marketing precisará avaliar a média salarial
de todos os clientes da empresa, mas apenas de ocupação Professional.
Utilize um comando SQL para atingir esse resultado.
Questão 3
3 Você precisará fazer uma análise da quantidade de funcionários das lojas
registradas na empresa. O seu gerente te pediu os seguintes números e
informações:
a. Quantos funcionários tem a loja com mais funcionários?
b. Qual é o nome dessa loja?
c. Quantos funcionários tem a loja com menos funcionários?
d. Qual é o nome dessa loja?
FUNÇÕES DE AGREGAÇÃO
EXERCÍCIOS 4
Questão 4
A área de RH está com uma nova ação para a empresa, e para isso
precisa saber a quantidade total de funcionários do sexo Masculino e do
sexo Feminino.
5 Questão 5
Agora você precisa fazer uma análise dos produtos. Será necessário
descobrir as seguintes informações:
GABARITOS
Questão 1
1 O gerente comercial pediu a você uma análise da Quantidade Vendida e
Quantidade Devolvida para o canal de venda mais importante da
empresa: Store.
Utilize uma função SQL para fazer essas consultas no seu banco de
dados. Obs: Faça essa análise considerando a tabela FactSales.
FUNÇÕES DE AGREGAÇÃO
GABARITOS
Questão 2
2 Uma nova ação no setor de Marketing precisará avaliar a média salarial
de todos os clientes da empresa, mas apenas de ocupação Professional.
Utilize um comando SQL para atingir esse resultado.
FUNÇÕES DE AGREGAÇÃO
GABARITOS
Questão 3
3 Você precisará fazer uma análise da quantidade de funcionários das lojas
registradas na empresa. O seu gerente te pediu os seguintes números e
informações:
a. Quantos funcionários tem a loja com mais funcionários?
b. Qual é o nome dessa loja?
c. Quantos funcionários tem a loja com menos funcionários?
d. Qual é o nome dessa loja?
FUNÇÕES DE AGREGAÇÃO
GABARITOS
Questão 4
4 A área de RH está com uma nova ação para a empresa, e para isso
precisa saber a quantidade total de funcionários do sexo Masculino e do
sexo Feminino.
GABARITOS
5 Questão 5
Agora você precisa fazer uma análise dos produtos. Será necessário
descobrir as seguintes informações:
Criando agrupamentos
O QUE VEREMOS NESTE MÓDULO
MÓDULO 6
GROUP BY: Criando agrupamentos
O comando GROUP BY permite agrupar valores de
acordo com uma coluna, por exemplo “total de
funcionários de acordo com o departamento".
EXERCÍCIOS 1
Questão 1
a. Faça um resumo da quantidade vendida (SalesQuantity) de acordo
com o canal de vendas (channelkey).
2 Questão 2
Você precisa fazer uma análise de vendas por produtos. O objetivo final
é descobrir o valor total vendido (SalesAmount) por produto
(ProductKey).
EXERCÍCIOS 3
Questão 3
a. Você deve fazer uma consulta à tabela FactOnlineSales e descobrir
qual é o ID (CustomerKey) do cliente que mais realizou compras
online (de acordo com a coluna SalesQuantity).
4 Questão 4
a. Faça um agrupamento e descubra a quantidade total de produtos
por marca.
b. Determine a média do preço unitário (UnitPrice) para cada
ClassName.
c. Faça um agrupamento de cores e descubra o peso total que cada cor
de produto possui.
5 Questão 5
Você deverá descobrir o peso total para cada tipo de produto
(StockTypeName). A tabela final deve considerar apenas a marca
‘Contoso’ e ter os seus valores classificados em ordem decrescente.
AGRUPAMENTOS
EXERCÍCIOS 6 Questão 6
Você seria capaz de confirmar se todas as marcas dos produtos possuem
à disposição todas as 16 opções de cores?
Questão 7
7 Faça um agrupamento para saber o total de clientes de acordo com o
Sexo e também a média salarial de acordo com o Sexo. Corrija qualquer
resultado “inesperado” com os seus conhecimentos em SQL.
8 Questão 8
Faça um agrupamento para descobrir a quantidade total de clientes e a
média salarial de acordo com o seu nível escolar. Utilize a coluna
Education da tabela DimCustomer para fazer esse agrupamento.
AGRUPAMENTOS
EXERCÍCIOS 9 Questão 9
Faça uma tabela resumo mostrando a quantidade total de funcionários
de acordo com o Departamento (DepartmentName). Importante: Você
deverá considerar apenas os funcionários ativos.
Questão 10
10 Faça uma tabela resumo mostrando o total de VacationHours para cada
cargo (Title). Você deve considerar apenas as mulheres, dos
departamentos de Production, Marketing, Engineering e Finance, para os
funcionários contratados entre os anos de 1999 e 2000.
AGRUPAMENTOS
GABARITOS
Questão 1
1 a. Faça um resumo da quantidade vendida (SalesQuantity) de acordo
com o canal de vendas (channelkey).
GABARITOS
2 Questão 2
Você precisa fazer uma análise de vendas por produtos. O objetivo final
é descobrir o valor total vendido (SalesAmount) por produto
(ProductKey).
GABARITOS
Questão 3
3 a. Você deve fazer uma consulta à tabela FactOnlineSales e descobrir
qual é o ID (CustomerKey) do cliente que mais realizou compras
online (de acordo com a coluna SalesQuantity).
GABARITOS
4 Questão 4
a. Faça um agrupamento e descubra a quantidade total de produtos
por marca.
b. Determine a média do preço unitário (UnitPrice) para cada
ClassName.
c. Faça um agrupamento de cores e descubra o peso total que cada cor
de produto possui.
AGRUPAMENTOS
GABARITOS
5 Questão 5
Você deverá descobrir o peso total para cada tipo de produto
(StockTypeName). A tabela final deve considerar apenas a marca
‘Contoso’ e ter os seus valores classificados em ordem decrescente.
AGRUPAMENTOS
GABARITOS
6 Questão 6
Você seria capaz de confirmar se todas as marcas dos produtos possuem
à disposição todas as 16 opções de cores? Nenhuma marca possui
um exemplar de cada cor.
AGRUPAMENTOS
GABARITOS
Questão 7
7 Faça um agrupamento para saber o total de clientes de acordo com o
Sexo e também a média salarial de acordo com o Sexo. Corrija qualquer
resultado “inesperado” com os seus conhecimentos em SQL.
AGRUPAMENTOS
GABARITOS
8 Questão 8
Faça um agrupamento para descobrir a quantidade total de clientes e a
média salarial de acordo com o seu nível escolar. Utilize a coluna
Education da tabela DimCustomer para fazer esse agrupamento.
AGRUPAMENTOS
GABARITOS
Questão 9
9 Faça uma tabela resumo mostrando a quantidade total de funcionários
de acordo com o Departamento (DepartmentName). Importante: Você
deverá considerar apenas os funcionários ativos.
AGRUPAMENTOS
GABARITOS
Questão 10
10 Faça uma tabela resumo mostrando o total de VacationHours para cada
cargo (Title). Você deve considerar apenas as mulheres, dos
departamentos de Production, Marketing, Engineering e Finance, para os
funcionários contratados entre os anos de 1999 e 2000.
MÓDULO 7
JOINs
O QUE VEREMOS NESTE MÓDULO
MÓDULO 7
Chave Primária vs. Chave Estrangeira
Uma Chave Primária é uma coluna que identifica as informações distintas em uma tabela. Geralmente é uma coluna de ID. Toda tabela terá uma, e
somente uma, chave primária. Essa chave é utilizada como identificador único da tabela, sendo representada por uma coluna que não receberá valores
repetidos.
Já uma Chave Estrangeira é uma coluna que permite relacionar as linhas de uma segunda tabela com a Chave Primária de uma primeira tabela.
Como pode ser visto abaixo, a tabela Categoria possui uma coluna chamada id_subcategoria, com valores que não se repetem. Essa será a Chave
Primária. Já na tabela de Produtos, a coluna de id_subcategoria também aparece, mas os valores se repetem. Isso porque podemos ter mais de um
produto pertencendo à mesma categoria. Na tabela de Produtos, a coluna de id_subcategoria vai ser a Chave Estrangeira e vai permitir a gente
relacionar os valores dessa coluna com a Chave Primária da tabela de Categoria.
Tabela Fato vs. Tabela Dimensão
Você provavelmente deve ter notado em nossas tabelas do
banco de dados Contoso que os nomes das tabelas possuem
um certo padrão: alguns nomes começam com a inicial Dim e DimChannel
outros com a inicial Fact. Chegou a hora de entender essa
nomenclatura.
FactSales
Tabela Fato vs. Tabela Dimensão
Uma Tabela Dimensão é uma tabela que contém
características de um determinado elemento: lojas, produtos,
funcionários, clientes, etc.
DimChannel
Nesta tabela, nenhum dos elementos principais irá se repetir. É
onde vamos encontrar nossas chaves primárias.
DimSubcategory
DimProduct
JOIN
Nas aulas anteriores vimos que existem dois tipos de tabelas: Dimensão e Fato. Essas tabelas podem ser relacionadas através de uma coluna: na tabela
Dimensão, identificamos a chave Primária, que será relacionada com a chave Estrangeira da tabela Fato.
Essas relações serão criadas por meio do que chamamos de JOIN’s. A tradução literal dessa palavra é “juntar”, “unir”. Os JOINs vão nos permitir fazer
exatamente isso: juntar as nossas tabelas Fato e Dimensão, de forma a complementar as informações umas das outras.
RIGHT OUTER
LEFT OUTER JOIN INNER JOIN FULL OUTER JOIN LEFT ANTI JOIN RIGHT ANTI JOIN FULL ANTI JOIN
JOIN
Veremos mais a frente que os Joins mais utilizados serão o LEFT JOIN e o INNER JOIN. Porém, vamos aprender na prática como todos eles funcionam.
LEFT (OUTER) JOIN
O LEFT JOIN vai nos permitir relacionar duas tabelas (Tabela A e Tabela B) e criar uma nova tabela (Tabela C) que é a junção das duas.
A tabela resultante desse JOIN terá todas as linhas exclusivas apenas da tabela A, mais as linhas que são a interseção entre a Tabela A e a Tabela B.
Nenhuma linha presente apenas na Tabela B será incluída na tabela resultante desse JOIN.
RIGHT (OUTER) JOIN
O RIGHT JOIN vai nos permitir relacionar duas tabelas (Tabela A e Tabela B) e criar uma nova tabela (Tabela C) que é a junção das duas.
A tabela resultante desse JOIN terá todas as linhas exclusivas apenas da tabela B, mais as linhas que são a interseção entre a Tabela A e a Tabela B.
Nenhuma linha presente apenas na Tabela A será incluída na tabela resultante desse JOIN.
INNER (OUTER) JOIN
O INNER JOIN vai nos permitir relacionar duas tabelas (Tabela A e Tabela B) e criar uma nova tabela (Tabela C) que é a junção das duas.
A tabela resultante desse JOIN terá apenas as linhas que são a interseção entre a Tabela A e a Tabela B.
FULL (OUTER) JOIN
O FULL JOIN vai nos permitir relacionar duas tabelas (Tabela A e Tabela B) e criar uma nova tabela (Tabela C) que é a junção das duas.
A tabela resultante desse JOIN terá todas as linhas da Tabela A e todas as linhas da Tabela B.
LEFT (ANTI) JOIN
O LEFT (ANTI) JOIN vai nos permitir relacionar duas tabelas (Tabela A e Tabela B) e criar uma nova tabela (Tabela C) que é a junção das duas.
A tabela resultante desse JOIN terá apenas as linhas que só existem na Tabela A.
RIGHT (ANTI) JOIN
O RIGHT (ANTI) JOIN vai nos permitir relacionar duas tabelas (Tabela A e Tabela B) e criar uma nova tabela (Tabela C) que é a junção das duas.
A tabela resultante desse JOIN terá apenas as linhas que só existem na Tabela B.
FULL (ANTI) JOIN
O FULL (ANTI) JOIN vai nos permitir relacionar duas tabelas (Tabela A e Tabela B) e criar uma nova tabela (Tabela C) que é a junção das duas.
A tabela resultante desse JOIN terá apenas as linhas que só existem na Tabela A ou na Tabela B.
LEFT, RIGHT e INNER JOIN: exemplos práticos
Para fazer os exemplos a seguir, utilize os códigos a seguir para criar as tabelas de exemplo. Cada código deve ser executado em uma Consulta
diferente.
Crie uma Nova Consulta e utilize o primeiro código abaixo. Nele, vamos apenas criar um novo Banco de Dados para armazenar nossas Tabelas de
exemplo (Obs: entraremos mais a fundo na parte de criação de tabelas e bancos de dados no módulo CRUD).
Consulta 1
LEFT, RIGHT e INNER JOIN: exemplos práticos
Na consulta 2, utilize o código abaixo para criar a tabela de Produtos, com 5 produtos de exemplo e as seguintes informações: id_produto, nome_produto
e id_subcategoria. (Obs: entraremos mais a fundo na parte de criação de tabelas e bancos de dados no módulo CRUD).
Consulta 2
LEFT, RIGHT e INNER JOIN: exemplos práticos
Na consulta 3, utilize o código abaixo para criar a tabela de Subcategoria, com 5 subcategorias de exemplo. Essa tabela terá as seguintes informações:
id_subcategoria e nome_subcategoria. (Obs: entraremos mais a fundo na parte de criação de tabelas e bancos de dados no módulo CRUD).
Consulta 3
LEFT, RIGHT e INNER JOIN: exemplos práticos
Na consulta ao lado, realizamos um LEFT JOIN.
O que vale a gente pensar no momento é que esse join tinha como
finalidade complementar as informações de subcategoria em nossa
tabela de produtos. É mais intuitivo pensar que queremos
complementar a tabela da esquerda com as informações da tabela da
direita. E para chegar nesse resultado, usamos o LEFT JOIN.
O RIGHT JOIN nos leva a uma lógica um pouco mais confusa, por
isso preferimos utilizar o LEFT JOIN, por ser mais intuitivo.
Situação 1
LEFT OUTER JOIN INNER JOIN
Situação 2
Com este JOIN, conseguimos criar uma tabela que é a combinação de todos os
valores entre duas colunas.
Qual é a diferença?
EXERCÍCIOS 1 Questão 1
Utilize o INNER JOIN para trazer os nomes das subcategorias dos
produtos, da tabela DimProductSubcategory para a tabela DimProduct.
2 Questão 2
Identifique uma coluna em comum entre as tabelas
DimProductSubcategory e DimProductCategory. Utilize essa coluna
para complementar informações na tabela DimProductSubcategory a
partir da DimProductCategory. Utilize o LEFT JOIN.
3 Questão 3
Para cada loja da tabela DimStore, descubra qual o Continente e o Nome
do País associados (de acordo com DimGeography). Seu SELECT final
deve conter apenas as seguintes colunas: StoreKey, StoreName,
EmployeeCount, ContinentName e RegionCountryName. Utilize o LEFT
JOIN neste exercício.
JOINs
EXERCÍCIOS 4 Questão 4
Complementa a tabela DimProduct com a informação de
ProductCategoryDescription. Utilize o LEFT JOIN e retorne em seu
SELECT apenas as 5 colunas que considerar mais relevantes.
5 Questão 5
A tabela FactStrategyPlan resume o planejamento estratégico da
empresa. Cada linha representa um montante destinado a uma
determinada AccountKey.
EXERCÍCIOS 6 Questão 6
Vamos continuar analisando a tabela FactStrategyPlan. Além da coluna
AccountKey que identifica o tipo de conta, há também uma outra coluna
chamada ScenarioKey. Essa coluna possui a numeração que identifica o
tipo de cenário: Real, Orçado e Previsão.
7 Questão 7
Algumas subcategorias não possuem nenhum exemplar de produto.
Identifique que subcategorias são essas.
JOINs
EXERCÍCIOS 8 Questão 8
A tabela abaixo mostra a combinação entre Marca e Canal de Venda,
para as marcas Contoso, Fabrikam e Litware. Crie um código SQL para
chegar no mesmo resultado.
JOINs
EXERCÍCIOS 9 Questão 9
Neste exercício, você deverá relacionar as tabelas FactOnlineSales com
DimPromotion. Identifique a coluna que as duas tabelas têm em comum
e utilize-a para criar esse relacionamento.
EXERCÍCIOS 10 Questão 10
A tabela abaixo é resultado de um Join entre a tabela FactSales e as
tabelas: DimChannel, DimStore e DimProduct.
GABARITOS
1 Questão 1
Utilize o INNER JOIN para trazer os nomes das subcategorias dos
produtos, da tabela DimProductSubcategory para a tabela DimProduct.
JOINs
GABARITOS
2 Questão 2
Identifique uma coluna em comum entre as tabelas
DimProductSubcategory e DimProductCategory. Utilize essa coluna
para complementar informações na tabela DimProductSubcategory a
partir da DimProductCategory. Utilize o LEFT JOIN.
JOINs
GABARITOS
3 Questão 3
Para cada loja da tabela DimStore, descubra qual o Continente e o Nome
do País associados (de acordo com DimGeography). Seu SELECT final
deve conter apenas as seguintes colunas: StoreKey, StoreName,
EmployeeCount, ContinentName e RegionCountryName. Utilize o LEFT
JOIN neste exercício.
JOINs
GABARITOS
4 Questão 4
Complementa a tabela DimProduct com a informação de
ProductCategoryDescription. Utilize o LEFT JOIN e retorne em seu
SELECT apenas as 5 colunas que considerar mais relevantes.
JOINs
GABARITOS
5 Questão 5
A tabela FactStrategyPlan resume o planejamento estratégico da
empresa. Cada linha representa um montante destinado a uma
determinada AccountKey.
GABARITOS
6 Questão 6
Vamos continuar analisando a tabela FactStrategyPlan. Além da coluna
AccountKey que identifica o tipo de conta, há também uma outra coluna
chamada ScenarioKey. Essa coluna possui a numeração que identifica o
tipo de cenário: Real, Orçado e Previsão.
GABARITOS
7 Questão 7
Algumas subcategorias não possuem nenhum exemplar de produto.
Identifique que subcategorias são essas.
JOINs
GABARITOS
8 Questão 8
A tabela abaixo mostra a combinação entre Marca e Canal de Venda,
para as marcas Contoso, Fabrikam e Litware. Crie um código SQL para
chegar no mesmo resultado.
JOINs
GABARITOS
9 Questão 9
Neste exercício, você deverá relacionar as tabelas FactOnlineSales com
DimPromotion. Identifique a coluna que as duas tabelas têm em comum
e utilize-a para criar esse relacionamento.
GABARITOS
10 Questão 10
A tabela abaixo é resultado de um Join entre a tabela FactSales e as
tabelas: DimChannel, DimStore e DimProduct.
Group By + Joins
Aplicações
O QUE VEREMOS NESTE MÓDULO
MÓDULO 8
GROUP BY + INNER JOIN
Nos últimos dois módulos, aprendemos a criar
agrupamentos com o GROUP BY e também
aprendemos a fazer relações/junções entre tabelas,
por meio dos JOINs.
EXERCÍCIOS 1 Questão 1
a. Faça um resumo da quantidade vendida (Sales Quantity) de acordo
com o nome do canal de vendas (ChannelName). Você deve ordenar
a tabela final de acordo com SalesQuantity, em ordem decrescente.
2 Questão 2
Você precisa fazer uma análise de vendas por produtos. O objetivo final
é descobrir o valor total vendido (SalesAmount) por produto.
a. Descubra qual é a cor de produto que mais é vendida (de acordo
com SalesQuantity).
EXERCÍCIOS 3 Questão 3
Crie um agrupamento de quantidade vendida (SalesQuantity) por
categoria do produto (ProductCategoryName).
Obs: Você precisará fazer mais de 1 INNER JOIN, dado que a relação
entre FactSales e DimProductCategory não é direta.
4 Questão 4
a. Você deve fazer uma consulta à tabela FactOnlineSales e descobrir
qual é o nome completo do cliente que mais realizou compras online
(de acordo com a coluna SalesQuantity).
5 Questão 5
Faça um resumo mostrando o total de produtos comprados (Sales
Quantity) de acordo com o sexo dos clientes.
GROUP BY + JOIN
EXERCÍCIOS 6 Questão 6
Faça uma tabela resumo mostrando a taxa de câmbio média de acordo
com cada CurrencyDescription. A tabela final deve conter apenas taxas
entre 10 e 100.
7 Questão 7
Descubra o valor total na tabela FactStrategyPlan destinado aos
cenários: Actual e Budget.
8 Questão 8
Faça uma tabela resumo mostrando o resultado do planejamento
estratégico (FactStrategyPlan ) por ano.
GROUP BY + JOIN
EXERCÍCIOS 9 Questão 9
Faça um agrupamento de quantidade de produtos por
ProductSubcategoryName. Leve em consideração em sua análise apenas
a marca Contoso e a cor Silver.
10 Questão 10
Faça um agrupamento duplo de quantidade de produtos por
BrandName e ProductSubcategoryName. A tabela final deverá ser
ordenada de acordo com a coluna BrandName.
GROUP BY + JOIN
GABARITOS
1 Questão 1
a. Faça um resumo da quantidade vendida (Sales Quantity) de acordo
com o nome do canal de vendas (ChannelName). Você deve ordenar
a tabela final de acordo com SalesQuantity, em ordem decrescente.
GABARITOS
1 Questão 1
a. Faça um resumo da quantidade vendida (Sales Quantity) de acordo
com o nome do canal de vendas (ChannelName). Você deve ordenar
a tabela final de acordo com SalesQuantity, em ordem decrescente.
GABARITOS
1 Questão 1
a. Faça um resumo da quantidade vendida (Sales Quantity) de acordo
com o nome do canal de vendas (ChannelName). Você deve ordenar
a tabela final de acordo com SalesQuantity, em ordem decrescente.
GABARITOS
2 Questão 2
Você precisa fazer uma análise de vendas por produtos. O objetivo final
é descobrir o valor total vendido (SalesAmount) por produto.
a. Descubra qual é a cor de produto que mais é vendida (de acordo
com SalesQuantity).
GABARITOS
2 Questão 2
Você precisa fazer uma análise de vendas por produtos. O objetivo final
é descobrir o valor total vendido (SalesAmount) por produto.
a. Descubra qual é a cor de produto que mais é vendida (de acordo
com SalesQuantity).
GABARITOS
3 Questão 3
Crie um agrupamento de quantidade vendida (SalesQuantity) por
categoria do produto (ProductCategoryName).
Obs: Você precisará fazer mais de 1 INNER JOIN, dado que a relação
entre FactSales e DimProductCategory não é direta.
GROUP BY + JOIN
GABARITOS
4 Questão 4
a. Você deve fazer uma consulta à tabela FactOnlineSales e descobrir
qual é o nome completo do cliente que mais realizou compras online
(de acordo com a coluna SalesQuantity).
GABARITOS
4 Questão 4
a. Você deve fazer uma consulta à tabela FactOnlineSales e descobrir
qual é o nome completo do cliente que mais realizou compras online
(de acordo com a coluna SalesQuantity).
GABARITOS
5 Questão 5
Faça um resumo mostrando o total de produtos comprados (Sales
Quantity) de acordo com o sexo dos clientes.
GROUP BY + JOIN
GABARITOS
6 Questão 6
Faça uma tabela resumo mostrando a taxa de câmbio média de acordo
com cada CurrencyDescription. A tabela final deve conter apenas taxas
entre 10 e 100.
GROUP BY + JOIN
GABARITOS
7 Questão 7
Descubra o valor total na tabela FactStrategyPlan destinado aos
cenários: Actual e Budget.
GROUP BY + JOIN
GABARITOS
8 Questão 8
Faça uma tabela resumo mostrando o resultado do planejamento
estratégico (FactStrategyPlan ) por ano.
GROUP BY + JOIN
GABARITOS
9 Questão 9
Faça um agrupamento de quantidade de produtos por
ProductSubcategoryName. Leve em consideração em sua análise apenas
a marca Contoso e a cor Silver.
GROUP BY + JOIN
GABARITOS
10 Questão 10
Faça um agrupamento duplo de quantidade de produtos por
BrandName e ProductSubcategoryName. A tabela final deverá ser
ordenada de acordo com a coluna BrandName.
MÓDULO 9
Variáveis
O QUE VEREMOS NESTE MÓDULO
MÓDULO 9
Tipos de dados e operações básicas
Inteiro (INT)
1
Todo dado possui um tipo específico: ele pode ser um
número, um texto ou uma data. Qualquer número que seja representado apenas pela sua parte inteira,
sem casas decimais. Exemplos: 1, 100, 589.
Em resumo, temos abaixo os 4 principais tipos de dados:
A forma como o SQL vai entender que estamos trabalhando com um
número inteiro será através do identificador INT
Decimal (FLOAT)
Qualquer número que contenha casas decimais. Exemplos: 10.33,
90.91, 410.87.
2
A forma como o SQL vai entender que estamos trabalhando com um
número decimal será através do identificador FLOAT.
Texto (VARCHAR)
3 Toda cadeia de caracteres que pode ser interpretada como um texto.
Exemplos: ‘Carla’, ‘Motorola’, ‘Pastel’, ‘44’.
Data (DATETIME) A forma como o SQL vai entender que estamos trabalhando com um
4
texto será através do identificador VARCHAR
Qualquer dado no formado de data. Exemplos: ‘01/01/2021’,
‘23/03/2021’.
A forma como o SQL vai entender que estamos trabalhando com uma
data será através do identificador DATETIME
Tipos de dados e operações básicas
Os tipos de dados determinam quais operações conseguimos fazer com os dados:
operações matemáticas, concatenação, etc.
• INT: inteiro
• FLOAT: decimal
• VARCHAR: texto/string
• DATETIME: data
Uma variável é um objeto que armazena o valor de um dado. Imagine por exemplo a sua carteira. A sua carteira é capaz de armazenar uma determinada
quantidade de dinheiro: 10 reais, 20 reais, 100 reais. A carteira é como se fosse a variável, o local onde armazenamos um valor, no caso, o dinheiro.
Variáveis são muito úteis para tornar nossos cálculos mais automáticos. Sempre que precisarmos utilizar um mesmo valor diversas vezes ao longo do
código, podemos utilizar variáveis pro caso da gente precisar alterar estes valores de uma vez. Com variáveis, alteramos uma vez só e o código ficará
muito mais otimizado.
Ou seja, toda declaração começa com um DECLARE, seguido do nome da variável (iniciando com o @), um TIPO (que pode ser INT, FLOAT, VARCHAR ou
DATETIME, e na linha seguinte atribuímos um valor a essa variável.
Exemplo:
Exemplo:
Dessa vez, criamos uma variável @varData para tornar o filtro das
consultas mais automático.
Assim, sempre que a gente quiser analisar uma nova data, alteramos o
valor da variável uma única vez, e todos os lugares que utilizarem esse
valor dentro do código serão atualizados automaticamente.
Armazenando o resultado de uma consulta em uma variável
Podemos também armazenar o resultado de uma consulta
dentro de uma variável.
EXERCÍCIOS 1 Questão 1
Declare 4 variáveis inteiras. Atribua os seguintes valores a elas:
valor1 = 10
valor2 = 5
valor3 = 34
valor4 = 7
EXERCÍCIOS 2 Questão 2
Para cada declaração das variáveis abaixo, atenção em relação ao tipo
de dado que deverá ser especificado.
EXERCÍCIOS 3 Questão 3
Você é responsável por gerenciar um banco de dados onde são
recebidos dados externos de usuários. Em resumo, esses dados são:
- Nome do usuário
- Data de nascimento
- Quantidade de pets que aquele usuário possui
Você precisará criar um código em SQL capaz de juntar as informações
fornecidas por este usuário. Para simular estes dados, crie 3 variáveis,
chamadas: nome, data_nascimento e num_pets. Você deverá armazenar
os valores ‘André’, ‘10/02/1998’ e 2, respectivamente.
O resultado final a ser alcançado é mostrado no print abaixo:
EXERCÍCIOS 4 Questão 4
Você acabou de ser promovido e o seu papel será realizar um controle de
qualidade sobre as lojas da empresa.
A primeira informação que é passada a você é que o ano de 2008 foi bem
complicado para a empresa, pois foi quando duas das principais lojas
fecharam. O seu primeiro desafio é descobrir o nome dessas lojas que
fecharam no ano de 2008, para que você possa entender o motivo e
mapear planos de ação para evitar que outras lojas importantes tomem o
mesmo caminho.
O seu resultado deverá estar estruturado em uma frase, com a seguinte
estrutura:
‘As lojas fechadas no ano de 2008 foram: ’ + nome_das_lojas
5 Questão 5
Você precisa criar uma consulta para mostrar a lista de produtos da tabela
DimProduct para uma subcategoria específica: ‘Lamps’.
Utilize o conceito de variáveis para chegar neste resultado.
VÁRIÁVEIS
GABARITOS
1 Questão 1
Declare 4 variáveis inteiras. Atribua os seguintes valores a elas:
valor1 = 10
valor2 = 5
valor3 = 34
valor4 = 7
GABARITOS
2 Questão 2
Para cada declaração das variáveis abaixo, atenção em relação ao tipo
de dado que deverá ser especificado.
GABARITOS
3 Questão 3
Você é responsável por gerenciar um banco de dados onde são
recebidos dados externos de usuários. Em resumo, esses dados são:
- Nome do usuário
- Data de nascimento
- Quantidade de pets que aquele usuário possui
Você precisará criar um código em SQL capaz de juntar as informações
fornecidas por este usuário. Para simular estes dados, crie 3 variáveis,
chamadas: nome, data_nascimento e num_pets. Você deverá armazenar
os valores ‘André’, ‘10/02/1998’ e 2, respectivamente.
O resultado final a ser alcançado é mostrado no print abaixo:
GABARITOS
4 Questão 4
Você acabou de ser promovido e o seu papel será realizar um controle de
qualidade sobre as lojas da empresa.
A primeira informação que é passada a você é que o ano de 2008 foi bem
complicado para a empresa, pois foi quando duas das principais lojas
fecharam. O seu primeiro desafio é descobrir o nome dessas lojas que
fecharam no ano de 2008, para que você possa entender o motivo e
mapear planos de ação para evitar que outras lojas importantes tomem o
mesmo caminho.
O seu resultado deverá estar estruturado em uma frase, com a seguinte
estrutura:
‘As lojas fechadas no ano de 2008 foram: ’ + nome_das_lojas
GABARITOS
5 Questão 5
Você precisa criar uma consulta para mostrar a lista de produtos da tabela
DimProduct para uma subcategoria específica: ‘Lamps’.
Utilize o conceito de variáveis para chegar neste resultado.
MÓDULO 10
Manipulando Strings e
Datas no SQL
O QUE VEREMOS NESTE MÓDULO
MÓDULO 10
LEN e DATALENGTH
As funções LEN e DATALENGTH possuem resultados
semelhantes: ambos retornam a quantidade de caracteres de
um determinado texto.
1. Texto
2. Posição inicial do texto a ser extraído
3. Quantidade de caracteres a ser extraído
Funções Condicionais
O QUE VEREMOS NESTE MÓDULO
MÓDULO 11
CASE WHEN... ELSE
Assim como qualquer linguagem de programação, no SQL também
podemos tratar condições.
O ideal seria que a gente fizesse um novo teste, para conseguir verificar se, caso o
Gênero não seja nem ‘M’ nem ‘F’, ai sim podemos considerar como ‘Empresa’.
Observe na imagem ao lado o resultado final deste CASE com dois testes lógicos.
CASE + AND
Podemos combinar o CASE com o AND para criar testes lógicos
ainda mais avançados.
- Acima de 40 funcionários
- Entre 30 e 39 funcionários
- Entre 20 e 29 funcionários
- Abaixo de 19 funcionários
1. Teste Lógico
2. Valor se verdadeiro
3. Valor se falso
Podemos utilizar a função ISNULL para verificar essa coluna (no 1º argumento) e
caso o valor seja nulo, ele retornará um resultado alternativo.
Views
O QUE VEREMOS NESTE MÓDULO
MÓDULO 12
Introdução
Até aqui vimos como criar diferentes consultas aos bancos de
dados. Utilizamos comandos como o SELECT, GROUP BY, JOINs,
etc para criar tabelas como a mostrada ao lado.
Mas pra onde foram todas essas tabelas que a gente criou? Elas
estão em algum lugar?
Tudo o que fizemos até agora foi apenas visualizar alguns dados
das nossas tabelas do Banco de Dados, nada além disso. Quando
executamos um SELECT e logo em seguida executamos outro
SELECT, o resultado do primeiro é perdido.
• Ela contém linhas e colunas assim como uma tabela real. Nela
podemos utilizar comandos como o JOIN, WHERE e outras
funções.
Sempre que necessário, Ao criar uma View, estamos ocultando Quando criamos Views,
podemos consultar aquela linhas ou colunas da tabela original do estamos poupando o tempo
View, pois ela fica armazenada banco de dados. Desta forma, apenas de recriar vários SELECTs, o
algumas informações relevantes serão
no sistema. que aumenta a produtividade.
visualizadas na View.
CREATE VIEW: Criando a primeira VIEW
Para criar uma View, utilizamos o comando CREATE VIEW. Na Uma vez criada, a View ficará armazenada no banco de dados, na pasta de
imagem abaixo temos a estrutura padrão: Exibições.
CREATE VIEW nome_da_view AS E para selecionar essa View, utilizamos o comando SELECT.
SELECT
Coluna1,
Coluna2,
Coluna3
FROM
Tabela
ALTER VIEW: Alterando uma VIEW criada
Para alterar uma View criada, usamos o comando ALTER VIEW.
EXERCÍCIOS 1 Questão 1
a. A partir da tabela DimProduct, crie uma View contendo as
informações de ProductName, ColorName, UnitPrice e UnitCost, da
tabela DimProduct. Chame essa View de vwProdutos.
Questão 2
2 Crie uma View contendo as informações de Nome Completo (FirstName
+ LastName), Gênero (por extenso), E-mail e Renda Anual (formatada
com R$).
EXERCÍCIOS 3 Questão 3
a. A partir da tabela DimStore, crie uma View que considera apenas as
lojas ativas. Faça um SELECT de todas as colunas. Chame essa View
de vwLojasAtivas.
c. Crie uma View de uma tabela que considera apenas os produtos das
marcas Contoso e Litware. Além disso, a sua View deve considerar
apenas os produtos de cor Silver. Faça um SELECT de todas as
colunas da tabela DimProduct. Chame essa View de
vwContosoLitwareSilver.
Questão 4
4 Crie uma View que seja o resultado de um agrupamento da tabela
FactSales. Este agrupamento deve considerar o SalesQuantity
(Quantidade Total Vendida) por Nome do Produto. Chame esta View de
vwTotalVendidoProdutos.
OBS: Para isso, você terá que utilizar um JOIN para relacionar as tabelas
FactSales e DimProduct.
VIEWS
EXERCÍCIOS 5 Questão 5
Faça as seguintes alterações nas tabelas da questão 1.
6 Questão 6
a. Crie uma View que seja o resultado de um agrupamento da tabela
DimProduct. O resultado esperado da consulta deverá ser o total de
produtos por marca. Chame essa View de vw_6a.
GABARITOS
1 Questão 1
a. A partir da tabela DimProduct, crie uma View contendo as
informações de ProductName, ColorName, UnitPrice e UnitCost, da
tabela DimProduct. Chame essa View de vwProdutos.
GABARITOS
Questão 2
2 Crie uma View contendo as informações de Nome Completo (FirstName
+ LastName), Gênero (por extenso), E-mail e Renda Anual (formatada
com R$).
GABARITOS
3 Questão 3
a. A partir da tabela DimStore, crie uma View que considera apenas as
lojas ativas. Faça um SELECT de todas as colunas. Chame essa View
de vwLojasAtivas.
c. Crie uma View de uma tabela que considera apenas os produtos das
marcas Contoso e Litware. Além disso, a sua View deve considerar
apenas os produtos de cor Silver. Faça um SELECT de todas as
colunas da tabela DimProduct. Chame essa View de
vwContosoLitwareSilver.
VIEWS
GABARITOS
Questão 4
4 Crie uma View que seja o resultado de um agrupamento da tabela
FactSales. Este agrupamento deve considerar o SalesQuantity
(Quantidade Total Vendida) por Nome do Produto. Chame esta View de
vwTotalVendidoProdutos.
OBS: Para isso, você terá que utilizar um JOIN para relacionar as tabelas
FactSales e DimProduct.
VIEWS
GABARITOS
5 Questão 5
Faça as seguintes alterações nas tabelas da questão 1.
GABARITOS
6 Questão 6
a. Crie uma View que seja o resultado de um agrupamento da tabela
DimProduct. O resultado esperado da consulta deverá ser o total de
produtos por marca. Chame essa View de vw_6a.
CRUD
O QUE VEREMOS NESTE MÓDULO
MÓDULO 13
O que é CRUD?
Operações CRUD são operações que conseguimos fazer em um Banco de Dados. Essa sigla significa o seguinte:
CREATE
• Permite criar Bancos de Dados, Tabelas ou Exibições (Views)
READ
• Permite ler os dados do banco de dados. Basicamente foi o que mais fizemos no Curso, através do SELECT.
UPDATE
• Permite atualizar os dados do banco de dados, tabelas ou views.
DELETE
• Permite deletar dados de um banco de dados, tabelas ou views.
No módulo anterior, vimos como criar Views (exibições). Essas exibições não são entendidas exatamente como tabelas do banco de dados.
Agora o que vamos fazer é aprender como criar tabelas propriamente ditas,
Lembrando o que é um Banco de Dados…
Um banco de dados é composto por um conjunto de tabelas (vide exemplo Contoso).
Uma linha abrange várias colunas que juntas descrevem alguma característica de um objeto. Desta forma, uma coluna é como se
fosse uma categoria.
Portanto, cada objeto (registro/record) possui características que pertencem a essas categorias.
Agora o que vamos fazer é aprender como criar tabelas propriamente ditas,
Por que um Banco de Dados é importante
Como dito anteriormente, um Banco de Dados será usado para guardar todas as tabelas criadas. É importante entender que as
tabelas de um banco de dados precisam ter algum tipo de relação.
Tomando como exemplo o Banco de Dados Contoso, todas as tabelas ali dentro têm algum tipo de relação. Não faria sentido,
por exemplo, a gente criar uma tabela que contivesse informações de roupas da Riachuelo, sendo que é uma informação que não
tem relação nenhuma com a Contoso.
Como criar um Banco de Dados
CREATE DATABASE
Vimos no módulo anterior como criar VIEWS, usando o comando CREATE VIEW. Para criar um Banco de Dados, a lógica é semelhante. Isso vale para
tabelas.
Existem 2 formas de criar um Banco de Dados. Na primeira opção, podemos criar de forma manual clicando com o botão direito em cima da pasta Banco
de Dados, e depois em Novo Banco de Dados... A segunda opção seria através de um código simples em SQL.
DATETIME DATETIME
Como criar uma tabela
Para criar as tabelas nos Bancos de Dados, vamos utilizar as operações
CRUD da seguinte maneira:
CREATE TABLE
O comando CREATE TABLE vai nos permitir criar uma
nova tabela. Ao lado, temos um exemplo da estrutura
para utilização do comando. É neste momento que
declaramos o tipo de cada dado.
Como criar uma tabela
Para criar as tabelas nos Bancos de Dados, vamos utilizar as operações
CRUD da seguinte maneira:
INSERT INTO
Será através do comando INSERT INTO que vamos
adicionar novos valores em nossa tabela. Além deste
comando, precisaremos também do VALUES para
especificar os valores adicionados.
Como criar uma tabela
Para criar as tabelas nos Bancos de Dados, vamos utilizar as operações
CRUD da seguinte maneira:
UPDATE
Através do comando UPDATE conseguiremos atualizar
um valor dentro de uma tabela. Geralmente esse
comando é utilizado em conjunto com o WHERE, que
vai nos possibilitar identificar a linha onde vamos fazer
a alteração.
Como criar uma tabela
Para criar as tabelas nos Bancos de Dados, vamos utilizar as operações
CRUD da seguinte maneira:
DELETE
O comando DELETE é o que vai permitir a exclusão de
dados em uma tabela. Observe que ainda não estamos
falando de exclusão de tabelas, e sim exclusão de dados
dentro de uma tabela.
Como criar uma tabela
Para criar as tabelas nos Bancos de Dados, vamos utilizar as operações
CRUD da seguinte maneira:
DROP TABLE
O comando DROP TABLE permite a exclusão definitiva
de uma tabela dentro de um Banco de Dados.
CREATE e DROP DATABASE
Vamos criar/excluir nosso primeiro Banco de Dados.
EXERCÍCIOS 1
Questão 1
a) Crie um banco de dados chamado BD_Teste.
b) Exclua o banco de dados criado no item anterior.
c) Crie um banco de dados chamado Exercicios.
2 Questão 2
No banco de dados criado no exercício anterior, crie 3 tabelas, cada uma
contendo as seguintes colunas.
b) Definir qual será o tipo de dados mais adequado para cada coluna das
tabelas. Lembrando que os tipos de dados mais comuns são: INT,
FLOAT, VARCHAR e DATETIME.
EXERCÍCIOS 3
Questão 3
Em cada uma das 3 tabelas, adicione os seguintes valores:
TABELA dCliente
TABELA dGerente
TABELA fContratos
CRUD
EXERCÍCIOS 4
Questão 4
Novos dados deverão ser adicionados nas tabelas dCliente, dGerente e
fContratos. Fique livre para adicionar uma nova linha em cada tabela
contendo, respectivamente,
(1) um novo cliente (id cliente, nome e data de nascimento)
(2) um novo gerente (id gerente, nome, data de contratação e
salário)
(3) um novo contrato (id, data assinatura, id cliente, id gerente,
valor do contrato)
5 Questão 5
O contrato de ID igual a 4 foi registrado com alguns erros na tabela
fContratos. Faça uma alteração na tabela atualizando os seguintes
valores:
Data_de_Assinatura: 17/03/2019
ID_Gerente: 2
Valor_do_Contrato: 33500
6 Questão 6
Delete a linha da tabela fContratos que você criou na questão 4.
CRUD
GABARITOS
1 Questão 1
a) Crie um banco de dados chamado BD_Teste.
b) Exclua o banco de dados criado no item anterior.
c) Crie um banco de dados chamado Exercicios.
CRUD
GABARITOS
2 Questão 2
No banco de dados criado no exercício anterior, crie 3 tabelas, cada uma
contendo as seguintes colunas.
GABARITOS
3 Questão 3
Em cada uma das 3 tabelas, adicione os seguintes valores:
TABELA dGerente
CRUD
GABARITOS
4 Questão 4
Novos dados deverão ser adicionados nas tabelas dCliente, dGerente e
fContratos. Fique livre para adicionar uma nova linha em cada tabela
contendo, respectivamente,
(1) um novo cliente (id cliente, nome e data de nascimento)
(2) um novo gerente (id gerente, nome, data de contratação e
salário)
(3) um novo contrato (id, data assinatura, id cliente, id gerente,
valor do contrato)
CRUD
GABARITOS
5 Questão 5
O contrato de ID igual a 4 foi registrado com alguns erros na tabela
fContratos. Faça uma alteração na tabela atualizando os seguintes
valores:
Data_de_Assinatura: 17/03/2019
ID_Gerente: 2
Valor_do_Contrato: 33500
CRUD
GABARITOS
6 Questão 6
Delete a linha da tabela fContratos que você criou na questão 4.
MÓDULO 14
SUBQUERIES E CTE’S
O QUE VEREMOS NESTE MÓDULO
MÓDULO 14
Introdução
O QUE É UMA SUBQUERY?
Uma Subconsulta (ou Subquery ou SubSELECT) nada mais é do que uma consulta dentro de outra consulta. Ou seja, com
uma subquery conseguimos utilizar o resultado de uma query (consulta) dentro de outra consulta.
O exemplo abaixo ilustra bem a ideia principal de uma subquery. Para descobrir os produtos que têm o UnitPrice maior do
que a média, podemos adicionar um SELECT dentro de outro SELECT para criar uma consulta mais otimizada.
Onde utilizamos Subqueries
Utilizamos subqueries nas seguintes situações:
O segundo passo seria utilizar esse resultado em um filtro WHERE na tabela DimProduct.
Subquery na prática: Aplicação com WHERE (Exemplo 1)
Fazer dessa forma não é muito automático, pois escrevemos manualmente a média de preço no filtro. Se os preços alterarem ou
se tivermos adição ou exclusão de produtos, essa filtragem não será automática. O valor de 356.8301 continuará fixo mesmo
que a média se altere.
O ideal então seria utilizar uma subquery, substituindo o valor fixo de 356.8301 pelo SELECT que criamos para descobrir essa
média:
Na solução acima, utilizamos uma subquery, ou seja, um SELECT dentro de outro SELECT. Dessa forma, o cálculo da média de
preço ficará 100% automático, sem necessidade de atualizar manualmente o valor.
Dessa forma, precisaremos criar um SELECT que descubra o ID da categoria ‘Televisions’, e passar esse resultado como o valor
que queremos filtrar dentro do WHERE.
Exemplo:
=ANY(valor1, valor2, valor3)
Retorna todas as linhas da tabela que sejam iguais ao valor1 OU valor2 OU valor3.
O >ANY e >SOME retornam todas as linhas da tabela que tenham valores que sejam maiores a qualquer um dos valores da lista
de valores especificados.
Exemplo:
>ANY(valor1, valor2, valor3)
Retorna todas as linhas da tabela com valores maiores que o valor1 OU valor2 OU valor3. Ou seja, maior que o menor de
todos esses valores.
ANY e SOME
O <ANY e <SOME retornam todas as linhas da tabela que tenham valores que sejam menores que qualquer um dos valores da
lista de valores especificados.
Exemplo:
<ANY(valor1, valor2, valor3)
Retorna todas as linhas da tabela com valores menores que o valor1 OU valor2 OU valor3. Ou seja, menor que o maior
de todos esses valores.
ALL
O operador ALL também permite uma comparação entre valores especificados, mas para que a consulta retorne algum
resultado, é necessário que o valor comparado seja maior ou menor do que TODOS os valores da lista. (Obs: dificilmente
utilizamos =ALL pois estaríamos comparando um valor e esperando que ele fosse igual a todos os valores da lista. A menos que
todos os valores da lista fossem iguais, o =ALL não faria sentido)
Exemplo:
>ALL(valor1, valor2, valor3)
Retorna todas as linhas da tabela que sejam maiores que os valores valor1 E valor2 E valor3. Ou seja, as linhas que
possuem valores maiores que o máximo.
Exemplo:
<ALL(valor1, valor2, valor3)
Retorna todas as linhas da tabela com valores menores que o valor1 E valor2 E valor3. Ou seja, menor que o menor de
todos esses valores.
EXISTS
O operador EXISTS é usado para testar a
existência de qualquer registro (linha) em uma
subconsulta.
Poderíamos descobrir o segundo maior salário aplicando um TOP 2 + ORDER BY. Feito isso, descobriríamos que o segundo
maior salário é $160.000 e poderíamos utilizar esse resultado para filtrar a nossa tabela DimCustomer e descobrir os clientes
que recebem o 2º maior salário. Mas como tornar isso mais automático?
Subqueries aninhadas
Para resolver esse problema utilizando subqueries, teríamos que dividi-lo em etapas:
Subqueries aninhadas
A solução é mostrada ao lado. Repare que temos 3
SELECTs ao todo.
Subqueries aninhadas
O SELECT mais interno (3) é responsável por retornar pra 1
gente o maior de todos os salários.
EXERCÍCIOS 1
Questão 1
Para fins fiscais, a contabilidade da empresa precisa de uma tabela
contendo todas as vendas referentes à loja ‘Contoso Orlando Store’. Isso
porque essa loja encontra-se em uma região onde a tributação foi
modificada recente.
Portanto, crie uma consulta ao Banco de Dados para obter uma tabela
FactSales contendo todas as vendas desta loja.
Questão 2
2 O setor de controle de produtos quer fazer uma análise para descobrir
quais são os produtos que possuem um UnitPrice maior que o UnitPrice
do produto de ID igual a 1893.
EXERCÍCIOS 3
Questão 3
A empresa Contoso criou um programa de bonificação chamado “Todos
por 1”. Este programa consistia no seguinte: 1 funcionário seria
escolhido ao final do ano como o funcionário destaque, só que a
bonificação seria recebida por todos da área daquele funcionário em
particular. O objetivo desse programa seria o de incentivar a
colaboração coletiva entre os funcionários de uma mesma área. Desta
forma, o funcionário destaque beneficiaria não só a si, mas também a
todos os colegas de sua área.
EXERCÍCIOS 4
Questão 4
Faça uma query que retorne os clientes que recebem um salário anual
acima da média. A sua query deve retornar as colunas CustomerKey,
FirstName, LastName, EmailAddress e YearlyIncome.
5 Questão 5
A ação de desconto da Asian Holiday Promotion foi uma das mais bem
sucedidas da empresa. Agora, a Contoso quer entender um pouco
melhor sobre o perfil dos clientes que compraram produtos com essa
promoção.
Seu trabalho é criar uma query que retorne a lista de clientes que
compraram nessa promoção.
SUBQUERIES E CTE’s
EXERCÍCIOS 6
Questão 6
A empresa implementou um programa de fidelização de clientes
empresariais. Todos aqueles que comprarem mais de 3000 unidades de
um mesmo produto receberá descontos em outras compras.
Você deverá descobrir as informações de CustomerKey e
CompanyName destes clientes.
Questão 7
7 Você deverá criar uma consulta para o setor de vendas que mostre as
seguintes colunas da tabela DimProduct:
8 Questão 8
Faça uma consulta para descobrir os seguintes indicadores dos seus
produtos:
Maior quantidade de produtos por marca
Menor quantidade de produtos por marca
Média de produtos por marca
SUBQUERIES E CTE’s
EXERCÍCIOS 9
Questão 9
Crie uma CTE que seja o agrupamento da tabela DimProduct,
armazenando o total de produtos por marca. Em seguida, faça um
SELECT nesta CTE, descobrindo qual é a quantidade máxima de
produtos para uma marca. Chame esta CTE de
CTE_QtdProdutosPorMarca.
Questão 10
10 Crie duas CTEs:
(i) a primeira deve conter as colunas ProductKey, ProductName,
ProductSubcategoryKey, BrandName e UnitPrice, da tabela DimProduct,
mas apenas os produtos da marca Adventure Works. Chame essa CTE
de CTE_ProdutosAdventureWorks.
(ii) a segunda deve conter as colunas ProductSubcategoryKey,
ProductSubcategoryName, da tabela DimProductSubcategory mas
apenas para as subcategorias ‘Televisions’ e ‘Monitors’. Chame essa CTE
de CTE_CategoriaTelevisionsERadio.
Faça um Join entre essas duas CTEs, e o resultado deve ser uma query
contendo todas as colunas das duas tabelas. Observe nesse exemplo a
diferença entre o LEFT JOIN e o INNER JOIN.
SUBQUERIES E CTE’s
GABARITOS
Questão 1
1 Para fins fiscais, a contabilidade da empresa precisa de uma tabela
contendo todas as vendas referentes à loja ‘Contoso Orlando Store’. Isso
porque essa loja encontra-se em uma região onde a tributação foi
modificada recente.
Portanto, crie uma consulta ao Banco de Dados para obter uma tabela
FactSales contendo todas as vendas desta loja.
SUBQUERIES E CTE’s
GABARITOS
Questão 2
2 O setor de controle de produtos quer fazer uma análise para descobrir
quais são os produtos que possuem um UnitPrice maior que o UnitPrice
do produto de ID igual a 1893.
GABARITOS
Questão 3
3 A empresa Contoso criou um programa de bonificação chamado “Todos
por 1”. Este programa consistia no seguinte: 1 funcionário seria
escolhido ao final do ano como o funcionário destaque, só que a
bonificação seria recebida por todos da área daquele funcionário em
particular. O objetivo desse programa seria o de incentivar a
colaboração coletiva entre os funcionários de uma mesma área. Desta
forma, o funcionário destaque beneficiaria não só a si, mas também a
todos os colegas de sua área.
GABARITOS
Questão 4
4 Faça uma query que retorne os clientes que recebem um salário anual
acima da média. A sua query deve retornar as colunas CustomerKey,
FirstName, LastName, EmailAddress e YearlyIncome.
GABARITOS
5 Questão 5
A ação de desconto da Asian Holiday Promotion foi uma das mais bem
sucedidas da empresa. Agora, a Contoso quer entender um pouco
melhor sobre o perfil dos clientes que compraram produtos com essa
promoção.
Seu trabalho é criar uma query que retorne a lista de clientes que
compraram nessa promoção.
SUBQUERIES E CTE’s
GABARITOS
Questão 6
6 A empresa implementou um programa de fidelização de clientes
empresariais. Todos aqueles que comprarem mais de 3000 unidades de
um mesmo produto receberá descontos em outras compras.
Você deverá descobrir as informações de CustomerKey e
CompanyName destes clientes.
SUBQUERIES E CTE’s
GABARITOS
7 Questão 7
Você deverá criar uma consulta para o setor de vendas que mostre as
seguintes colunas da tabela DimProduct:
GABARITOS
Questão 8
8 Faça uma consulta para descobrir os seguintes indicadores dos seus
produtos:
Maior quantidade de produtos por marca
Menor quantidade de produtos por marca
Média de produtos por marca
SUBQUERIES E CTE’s
GABARITOS
Questão 9
9 Crie uma CTE que seja o agrupamento da tabela DimProduct,
armazenando o total de produtos por marca. Em seguida, faça um
SELECT nesta CTE, descobrindo qual é a quantidade máxima de
produtos para uma marca. Chame esta CTE de
CTE_QtdProdutosPorMarca.
SUBQUERIES E CTE’s
GABARITOS
Questão 10
10 Crie duas CTEs:
(i) a primeira deve conter as colunas ProductKey, ProductName,
ProductSubcategoryKey, BrandName e UnitPrice, da tabela DimProduct,
mas apenas os produtos da marca Adventure Works. Chame essa CTE
de CTE_ProdutosAdventureWorks.
(ii) a segunda deve conter as colunas ProductSubcategoryKey,
ProductSubcategoryName, da tabela DimProductSubcategory mas
apenas para as subcategorias ‘Televisions’ e ‘Monitors’. Chame essa CTE
de CTE_CategoriaTelevisionsERadio.
Faça um Join entre essas duas CTEs, e o resultado deve ser uma query
contendo todas as colunas das duas tabelas. Observe nesse exemplo a
diferença entre o LEFT JOIN e o INNER JOIN.
MÓDULO 15
LOOPS
O QUE VEREMOS NESTE MÓDULO
MÓDULO 15
WHILE
O QUE É UM LOOP Início
Verdadeiro
WHILE condição
BEGIN
comandos
END
Ou seja, enquanto uma determinada condição é satisfeita, todos os comandos dentro do bloco BEGIN.. END serão
executados.
WHILE - Exemplo
Imagine que a gente queira criar um contador, de 1 até 10, que printasse na
tela:
Observe que criamos uma linha para incrementar esta variável cada vez que
finalizamos um loop (SET @vContador = @vContador + 1).
EXERCÍCIOS 1
Questão 1
Utilize o Loop While para criar um contador que comece em um valor
inicial @ValorInicial e termine em um valor final @ValorFinal. Você
deverá printar na tela a seguinte frase:
“O valor do contador é: “ + ___
2 Questão 2
Você deverá criar uma estrutura de repetição que printe na tela
a quantidade de contratações para cada ano, desde 1996 até
2003. A informação de data de contratação encontra-se na
coluna HireDate da tabela DimEmployee. Utilize o formato:
X contratações em 1996
Y contratações em 1997
Z contratações em 1998
...
...
N contratações em 2003
Obs: a coluna HireDate contém a data completa (dd/mm/aaaa).
Lembrando que você deverá printar a quantidade de
contratações por ano.
LOOPS
EXERCÍCIOS 3
Questão 3
Utilize um Loop While para criar uma tabela chamada
Calendario, contendo uma coluna que comece com a data
01/01/2021 e vá até 31/12/2021.
LOOPS
GABARITOS
1 Questão 1
Utilize o Loop While para criar um contador que comece em um valor
inicial @ValorInicial e termine em um valor final @ValorFinal. Você
deverá printar na tela a seguinte frase:
“O valor do contador é: “ + ___
LOOPS
GABARITOS
2 Questão 2
Você deverá criar uma estrutura de repetição que printe na tela a
quantidade de contratações para cada ano, desde 1996 até 2003. A
informação de data de contratação encontra-se na coluna HireDate da
tabela DimEmployee. Utilize o formato:
X contratações em 1996
Y contratações em 1997
Z contratações em 1998
...
...
N contratações em 2003
Obs: a coluna HireDate contém a data completa (dd/mm/aaaa).
Lembrando que você deverá printar a quantidade de contratações por
ano.
LOOPS
GABARITOS
3 Questão 3
Utilize um Loop While para criar uma tabela chamada Calendario,
contendo uma coluna que comece com a data 01/01/2021 e vá até
31/12/2021.
MÓDULO 16
WINDOW FUNCTIONS
O QUE VEREMOS NESTE MÓDULO
MÓDULO 16
WINDOW FUNCTIONS - Introdução
PARA QUE SERVEM?
• São utilizadas para cálculos mais avançados de análises de dados;
• Possuem um uso semelhante ao GROUP BY, só que mais avançado e personalizável;
• A instrução OVER permite definir qual será a “janela” (conjunto de linhas) a ser considerado no cálculo;
• A instrução PARTITION BY divide o conjunto em “partições” nas quais as funções de janela são
aplicadas.
Window Functions - Introdução
QUAIS AS FINALIDADES?
As funções de janela possuem as seguintes finalidades:
1 2
O erro ocorreu porque quando incluímos o SUM dentro do SELECT, ele espera que a gente faça algum agrupamento com o
GROUP BY.
Window Functions - Introdução
Uma solução que poderíamos pensar seria utilizar o GROUP BY,
agrupando por todas as colunas da tabela, dado que queremos
visualizar todas essas colunas.
ROW_NUMBER
1 Cria uma coluna com a numeração das linhas da tabela. É como se fosse uma coluna de ID.
RANK
2 Cria uma coluna de ranking. Em caso de empates, os rankings dos números se repetem, mas o próximo ranking pula a
sequência. Ex: dois valores na posição 8, o valor seguinte pula para a posição 10.
DENSE_RANK
3 Cria uma coluna de ranking. Em caso de empates, os rankings dos números se repetem, e o próximo ranking continua a
sequência. Ex: dois valores na posição 8, o valor seguinte continua na posição 9.
NTILE
4 Distribui os valores de uma coluna em grupos.
Funções de Classificação – ROW_NUMBER, RANK, DENSE_RANK e NTILE
Este intervalo de soma pode ser especificado pelo trecho marcado na imagem acima. Observe a parte:
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
Como queremos fazer uma soma, isto significa que: a nossa janela de soma será entre as linhas anterior e atual. Ou seja, essa
soma será feita considerando sempre os valores da linha atual + a linha anterior.
Cálculo de soma móvel
Podemos testar outros resultados personalizando
a janela de soma. Dessa vez, se colocarmos
UNBOUNDED PRECEDING
Você pode entender também a parte destacada acima como uma especificação do intervalo da nossa janela de cálculo. Ela terá a
seguinte estrutura:
ROWS BETWEEN inicio_do_intervalo AND fim_do_intervalo
Exemplos desses intervalos podem ser:
- ROWS BETWEEN 1 PRECEDING AND CURRENT ROW: 1 linha antes e a linha atual.
- ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: todas as linhas antes e a linha atual.
- ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING: 1 linha antes e 1 linha depois da atual.
- ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING: todas as linhas antes e todas as linhas depois
da linha atual.
Funções de Offset
LAG
1 Faz um deslocamento nos valores, retornando um valor que está em uma posição anterior (1 linha anterior, 2 linhas
anteriores, etc).
LEAD
2 Faz um deslocamento nos valores, retornando o valor que está em uma posição posterior (1 linha seguinte, 2 linhas seguintes,
etc).
FIRST_VALUE
3 Cria uma coluna de ranking. Em caso de empates, os rankings dos números se repetem, e o próximo ranking continua a
sequência. Ex: dois valores na posição 8, o valor seguinte continua na posição 9.
LAST_VALUE
4 Distribui os valores de uma coluna em grupos.
Função LAG
O funcionamento da função LAG é bem intuitivo.
Ele permite acessar valores anteriores.
DESAFIO 1
EXERCÍCIOS 1
Questão 1
Utilize a View vwProdutos para criar uma coluna extra calculando a
quantidade total vendida dos produtos.
Questão 2
2 Crie mais uma coluna na consulta anterior, incluindo o total de produtos
vendidos para cada marca.
Questão 3
3 Calcule o % de participação do total de vendas de produtos por marca.
Ex: A marca A. Datum teve uma quantidade total de vendas de 199.041
de um total de 3.406.089 de vendas. Isso significa que a da marca A.
Datum é 199.041/3.406.089 = 5,84%.
WINDOW FUNCTIONS
EXERCÍCIOS 4
Questão 4
Crie uma consulta à View vwProdutos, selecionando as colunas Marca,
Cor, Quantidade_Vendida e também criando uma coluna extra de Rank
para descobrir a posição de cada Marca/Cor. Você deve obter o
resultado abaixo. Obs: Sua consulta deve ser filtrada para que seja
mostrada apenas a marca Contoso.
WINDOW FUNCTIONS
DESAFIO 2
Para responder os próximos 2 exercícios, você precisará criar uma View auxiliar.
A sua view deve se chamar vwHistoricoLojas e deve conter um histórico com a quantidade de
lojas abertas a cada Ano/Mês (como mostrado na figura à direita). Os desafios são:
EXERCÍCIOS 5
Questão 5
A partir da view criada no DESAFIO 2, você deverá fazer uma soma
móvel considerando sempre o mês atual + 2 meses para trás.
Questão 6
6 Utilize a vwHistoricoLojas para calcular o acumulado de lojas abertas
a cada ano/mês.
WINDOW FUNCTIONS
DESAFIO 3
Neste desafio, você terá que criar suas próprias tabelas e views para conseguir resolver os
exercícios 7 e 8. Os próximos exercícios envolverão análises de novos clientes. Para isso,
será necessário criar uma nova tabela e uma nova view.
Abaixo, temos um passo a passo para resolver o problema por partes.
PASSO 1: Crie um novo banco de dados chamado Desafio e selecione esse banco de dados
criado.
PASSO 2: Crie uma tabela de datas entre o dia 1 de janeiro do ano com a compra
(DateFirstPurchase) mais antiga e o dia 31 de dezembro do ano com a compra mais recente.
Obs1: Chame essa tabela de Calendario.
Obs2: A princípio, essa tabela deve conter apenas 1 coluna, chamada data e do tipo DATE.
PASSO 3: Crie colunas auxiliares na tabela Calendario chamadas: Ano, Mes, Dia, AnoMes e
NomeMes. Todas do tipo INT.
PASSO 4: Adicione na tabela os valores de Ano, Mês, Dia, AnoMes e NomeMes (nome do
mês em português). Dica: utilize a instrução CASE para verificar o mês e retornar o nome
certo.
PASSO 5: Crie a View vwNovosClientes, que deve ter as colunas mostradas abaixo.
WINDOW FUNCTIONS
EXERCÍCIOS 7
Questão 7
Faça um cálculo de soma móvel de novos clientes nos últimos 2
meses.
b) Faça um cálculo de média móvel de novos clientes nos
últimos 2 meses.
c) Faça um cálculo de acumulado dos novos clientes ao longo do
tempo.
d) Faça um cálculo de acumulado intra-ano, ou seja, um
acumulado que vai de janeiro a dezembro de cada ano, e volta a
fazer o cálculo de acumulado no ano seguinte.
Questão 8
8 Faça os cálculos de MoM e YoY para avaliar o percentual de
crescimento de novos clientes, entre o mês atual e o mês
anterior, e entre um mês atual e o mesmo mês do ano anterior.
WINDOW FUNCTIONS
DESAFIO 1
GABARITOS
Questão 1
1 Utilize a View vwProdutos para criar uma coluna extra calculando a
quantidade total vendida dos produtos
WINDOW FUNCTIONS
GABARITOS
Questão 2
2 Crie mais uma coluna na consulta anterior, incluindo o total de produtos
vendidos para cada marca.
WINDOW FUNCTIONS
GABARITOS
Questão 3
3 Calcule o % de participação do total de vendas de produtos por marca.
Ex: A marca A. Datum teve uma quantidade total de vendas de 199.041
de um total de 3.406.089 de vendas. Isso significa que a da marca A.
Datum é 199.041/3.406.089 = 5,84%.
WINDOW FUNCTIONS
GABARITOS
Questão 4
4 Crie uma consulta à View vwProdutos, selecionando as colunas Marca,
Cor, Quantidade_Vendida e também criando uma coluna extra de Rank
para descobrir a posição de cada Marca/Cor. Você deve obter o
resultado abaixo. Obs: Sua consulta deve ser filtrada para que seja
mostrada apenas a marca Contoso.
WINDOW FUNCTIONS
DESAFIO 2
Para responder os próximos 2 exercícios, você precisará criar uma View
auxiliar.
A sua view deve se chamar vwHistoricoLojas e deve conter um histórico
com a quantidade de lojas abertas a cada Ano/Mês (como mostrado na
figura à direita). Os desafios são:
GABARITOS
5 Questão 5
A partir da view criada no DESAFIO 2, você deverá fazer uma soma
móvel considerando sempre o mês atual + 2 meses para trás.
WINDOW FUNCTIONS
GABARITOS
Questão 6
6 Utilize a vwHistoricoLojas para calcular o acumulado de lojas abertas a
cada ano/mês.
WINDOW FUNCTIONS
DESAFIO 3
Neste desafio, você terá que criar suas próprias tabelas e views para
conseguir resolver os exercícios 7 e 8. Os próximos exercícios envolverão
análises de novos clientes. Para isso, será necessário criar uma nova tabela e
uma nova view.
Abaixo, temos um passo a passo para resolver o problema por partes.
PASSO 1: Crie um novo banco de dados chamado Desafio e selecione esse
banco de dados criado.
PASSO 2: Crie uma tabela de datas entre o dia 1 de janeiro do ano com a
compra (DateFirstPurchase) mais antiga e o dia 31 de dezembro do ano com
a compra mais recente.
Obs1: Chame essa tabela de Calendario.
Obs2: A princípio, essa tabela deve conter apenas 1 coluna, chamada data e
do tipo DATE.
DESAFIO 3
Neste desafio, você terá que criar suas próprias tabelas e views para
conseguir resolver os exercícios 7 e 8. Os próximos exercícios
envolverão análises de novos clientes. Para isso, será necessário criar
uma nova tabela e uma nova view.
Abaixo, temos um passo a passo para resolver o problema por partes.
PASSO 3: Crie colunas auxiliares na tabela Calendario chamadas: Ano,
Mes, Dia, AnoMes e NomeMes. Todas do tipo INT.
PASSO 4: Adicione na tabela os valores de Ano, Mês, Dia, AnoMes e
NomeMes (nome do mês em português). Dica: utilize a instrução CASE
para verificar o mês e retornar o nome certo.
DESAFIO 3
Neste desafio, você terá que criar suas próprias tabelas e views para
conseguir resolver os exercícios 7 e 8. Os próximos exercícios
envolverão análises de novos clientes. Para isso, será necessário criar
uma nova tabela e uma nova view.
Abaixo, temos um passo a passo para resolver o problema por partes.
PASSO 5: Crie a View vwNovosClientes, que deve ter as colunas
mostradas abaixo.
WINDOW FUNCTIONS
GABARITOS
7 Questão 7
Faça um cálculo de soma móvel de novos clientes nos últimos 2 meses.
b) Faça um cálculo de média móvel de novos clientes nos últimos 2
meses.
c) Faça um cálculo de acumulado dos novos clientes ao longo do tempo.
d) Faça um cálculo de acumulado intra-ano, ou seja, um acumulado que
vai de janeiro a dezembro de cada ano, e volta a fazer o cálculo de
acumulado no ano seguinte.
WINDOW FUNCTIONS
GABARITOS
Questão 8
8 Faça os cálculos de MoM e YoY para avaliar o percentual de
crescimento de novos clientes, entre o mês atual e o mês anterior, e
entre um mês atual e o mesmo mês do ano anterior.
MÓDULO 17
REGEX
(REGULAR EXPRESSIONS)
O QUE VEREMOS NESTE MÓDULO
MÓDULO 17
os
REGULAR EXPRESSIONS - Introdução
O QUE É E PARA QUE SERVEM?
• A expressão regular (conhecida como regex ou
regexp, do inglês regular expression) permite uma
forma de identificar cadeias de caracteres de
interesse, como caracteres específicos, palavras ou
Relembrando o LIKE...
padrões de caracteres.
o LIKE é um comando especial que nos permite filtrar textos de
• Em resumo, a expressão regular é uma forma de forma mais personalizada. No exemplo acima, estamos
permitir realizar, de forma simples, operações filtrando todas as descrições de produto que contenham o
bastante complexas com strings, que possivelmente texto Touchpad.
Em resumo, ele serve para indicar se um determinado campo será CASE INSENSITIVE e também a forma como interpreta a
acentuação das palavras. Observe os exemplos abaixo.
Ele pode ser definido em níveis diferentes no SQL Server. Abaixo estão os três
níveis:
Latin1_General_CI_AS
Onde CI significa Case Insensitive (não diferencia maiúsculas de minúsculas) e AS significa Accent Sensitive (sensível ao
sotaque).
Para descobrir o COLLATION configurado, podemos utilizar o comando abaixo:
Um pouco mais sobre COLLATE
2. A NÍVEL DE BANCO DE DADOS
Por padrão, todos os bancos de dados vão herdar a configuração do COLLATION feita durante a instalação do SQL Server.
Nós podemos também especificar o COLLATION do Banco de Dados no momento da sua criação.
Para alterar o COLLATE após criar um banco de dados, usamos o comando abaixo:*/
Para saber o COLLATION de um Banco de Dados específico, podemos usar o comando abaixo:
Um pouco mais sobre COLLATE
3. A NÍVEL DE TABELA/COLUNA
Por padrão, uma nova coluna de tipo VARCHAR herda o COLLATION do banco de dados, a menos que você especifique o
COLLATION explicitamente ao criar a tabela.
Para criar uma coluna com um COLLATION diferente, você pode especificar usando o comando Collate SQL.
Constraints
O QUE VEREMOS NESTE MÓDULO
MÓDULO 18
O que são CONSTRAINTS?
CONSTRAINTS no SQL são regras (restrições) que podemos definir para as colunas de uma tabela. Essas regras garantem
integridade ao Banco de Dados, pois é através delas que garantimos que apenas os valores que atendam às regras pré-
estabelecidas sejam incluídos em cada coluna.
NOT NULL
SQL
CONSTRAINTS
PRIMARY KEY CHECK
IDENTITY DEFAULT
Constraints: NOT NULL
A CONSTRAINT NOT NULL não permite que sejam adicionados valores nulos à coluna.
Definimos a restrição
IDENTITY para a coluna
id_contrato.
Nenhum dos valores de uma coluna de chave primária deve ser nulo ou se repetir. Será através dessa coluna que
criaremos relações entre as tabelas.
Se você respondeu que é porque não especificamos a coluna nome_cliente no nosso código, acertou!
Quando deixamos de informar uma coluna na hora de inserir novos dados, o sistema entende que aquela coluna
deve ser deixada vazia (preenchida com null). Como definimos, quando criamos nossa tabela dCliente, a restrição
NOT NULL para a coluna nome_cliente, o sistema vai retornar o seguinte erro ao tentar executar o código acima:
Desta forma, a tentativa de inserção de novo registro é considerada falha, e nenhum dado deste novo registro é
salvo no banco de dados, nem mesmo nas outras colunas que atendiam às especificações.
Violação de Constraints: CHECK
Recapitulando, a CONSTRAINT CHECK verifica se o valor adicionado na coluna atende a uma determinada
condição.
Quando violamos uma restrição CHECK, o sistema retorna um erro informando os nomes da constraint, do banco
de dados, da tabela e da coluna violada:
Desta forma, a tentativa de inserção de novo registro é considerada falha, e nenhum dado deste novo registro é
salvo no banco de dados, nem mesmo nas outras colunas que atendiam às especificações.
Violação de Constraints: UNIQUE
Recapitulando, a CONSTRAINT UNIQUE identifica uma coluna de forma única, sem permitir valores duplicados.
... pois o CPF informado já foi informado como sendo de outro cliente. Veja:
Quando violamos uma restrição UNIQUE, o sistema retorna um erro informando os nomes da constraint e da
tabela, assim como o valor da chave duplicada:
Desta forma, a tentativa de inserção de novo registro é considerada falha, e nenhum dado deste novo registro é
salvo no banco de dados, nem mesmo nas outras colunas que atendiam às especificações.
Violação de Constraints: PRIMARY KEY e FOREIGN KEY
Recapitulando, a CONSTRAINT PRIMARY KEY torna uma coluna a chave primária da tabela, ao passo que a
CONSTRAINT FOREIGN KEY torna uma coluna uma chave estrangeira da tabela, que será relacionada à chave
primária (PRIMARY KEY) de outra tabela.
... pois o id_gerente informado (10) não existe na tabela dGerente. Veja:
Violação de Constraints: PRIMARY KEY e FOREIGN KEY
Quando violamos as restrições PRIMARY KEY e FOREIGN KEY, o sistema retorna um erro informando os nomes da
constraint, do banco de dados, da tabela e da coluna violada:
Desta forma, a tentativa de inserção de novo registro é considerada falha, e nenhum dado deste novo registro é
salvo no banco de dados, nem mesmo nas outras colunas que atendiam às especificações.
Gerenciando Constraints: ADICIONAR
Vejamos agora como fazemos para adicionar, renomear e remover CONSTRAINTS.
Para ADICIONAR uma nova CONSTRAINT a uma tabela, utilizamos a seguinte sintaxe:
Exemplos:
Gerenciando Constraints: RENOMEAR
Vejamos agora como fazemos para adicionar, renomear e
remover CONSTRAINTS.
Exemplos:
CONSTRAINTS
Questão 1.a
EXERCÍCIOS 1.a Você está responsável por criar um Banco de Dados com algumas
tabelas que vão armazenar informações associadas ao aluguel de carros
de uma locadora.
Tabela 1: Cliente
- id_cliente
- nome_cliente
- cnh
- cartao
- id _carro
- placa
- modelo
- tipo
- id_locacao
- data_locacao
- data_devolucao
- id_carro
- id_cliente
Questão 2
2 Tente violar as constraints criadas para cada tabela. Este exercício é
livre.
GABARITOS
Questão 1.a
1.a Você está responsável por criar um Banco de Dados com algumas
tabelas que vão armazenar informações associadas ao aluguel de carros
de uma locadora.
GABARITOS
Questão 1.b – Tabela 1
1.b b) O seu banco de dados deve conter 3 tabelas e a descrição de cada uma
delas é mostrada abaixo:
Tabela 1: Cliente
- id_cliente
- nome_cliente
- cnh
- cartao
GABARITOS
- id _carro
- placa
- modelo
- tipo
GABARITOS
- id_locacao
- data_locacao
- data_devolucao
- id_carro
- id_cliente
GABARITOS
Questão 2
2 Tente violar as constraints criadas para cada tabela. Este
exercício é livre.
GABARITOS
Questão 2
2 Tente violar as constraints criadas para cada
tabela. Este exercício é livre.
GABARITOS
Questão 2
2 Tente violar as constraints criadas para cada
tabela. Este exercício é livre.
GABARITOS
Questão 2
2 Tente violar as constraints criadas para cada tabela. Este
exercício é livre.
Sequences
O QUE VEREMOS NESTE MÓDULO
MÓDULO 19
O que são SEQUENCES?
Uma sequência (SEQUENCE) é um objeto que utilizamos para criação de números sequenciais automáticos.
São usadas especialmente para gerar valores sequenciais únicos para as chaves primárias das tabelas.
Dessa forma, não precisamos ficar preenchendo a sequência de IDs manualmente (como fizemos até então).
Podemos gerá-los automaticamente por meio de uma SEQUENCE.
Vamos supor que queremos criar uma sequência para utilizar na tabela dCliente. Para isso, utilizamos um código que:
Será incrementada de 1 em 1;
Cada vez que você executar o código acima, ele retornará o próximo valor da sequência:
Como excluir SEQUENCES
Por fim, para excluir uma SEQUENCE, utilize o comando DROP SEQUENCE:
Como utilizar uma SEQUENCE na prática
Vejamos agora na prática como utilizar uma sequence.
Vamos supor que a gente queira criar uma sequência para uma tabela chamada dProjeto, que criaremos logo mais.
Para tanto, vamos utilizar o seguinte código, estabelecendo que a nossa sequence:
Será incrementada de 1 em 1;
Repare que para inserir os valores da coluna id_projeto, agora que temos uma sequence, não precisamos informar
número de ID por número de ID, manualmente. Basta informarmos nas linhas a serem inseridas o comando NEXT
VALUE FOR e o nome da sequence, conforme abaixo:
Como utilizar uma SEQUENCE na prática
Se consultarmos nossa tabela dProjeto agora, veremos que quatro registros foram inseridos, e a coluna id_projeto foi
devidamente preenchida com os valores automaticamente gerados pela sequence projetos_seq:
Como utilizar uma SEQUENCE na prática
Repare que se continuarmos inserindo novas linhas, estas também seguirão a ordem da sequence utilizada.
Veja que o ID gerado automaticamente para a coluna id_projeto do novo registro seguiu normalmente a numeração
da sequência:
SEQUENCES
Questão 0
EXERCÍCIOS 0 Crie o Banco de Dados AlugaFacil, onde serão criadas as sequences e
tabelas dos exercícios.
Questão 1
1 Vamos criar Sequences que serão utilizadas nas tabelas: Carro, Cliente e
Locacoes.
Tabela 1: Cliente
- id_cliente
- nome_cliente
- cnh
- cartao
- id _carro
- placa
- modelo
- tipo
- id_locacao
- data_locacao
- data_devolucao
- id_carro
- id_cliente
Questão 3
3 Exclua as sequences criadas.
SEQUENCES
GABARITOS
Questão 0
0 Crie o Banco de Dados AlugaFacil, onde serão criadas as
sequences e tabelas dos exercícios.
SEQUENCES
GABARITOS
Questão 1
1 Vamos criar Sequences que serão utilizadas nas tabelas: Carro,
Cliente e Locacoes.
GABARITOS
Tabela 1: Cliente
- id_cliente
- nome_cliente
- cnh
- cartao
GABARITOS
- id _carro
- placa
- modelo
- tipo
GABARITOS
- id_locacao
- data_locacao
- data_devolucao
- id_carro
- id_cliente
GABARITOS
Questão 2
2 Utilize as sequences nas 3 tabelas: Carro, Cliente e Locacoes.
SEQUENCES
GABARITOS
Questão 3
3 Exclua as sequences criadas.
MÓDULO 20
Transactions
O QUE VEREMOS NESTE MÓDULO
MÓDULO 20
O que são TRANSACTIONS?
Uma TRANSACTION é uma ação realizada dentro do banco de dados. Essa ação pode ser uma inserção (INSERT
INTO), uma atualização (UPDATE), ou uma exclusão (DELETE) de dados do banco. Precisamos de transações
quando estamos alterando o banco de dados de alguma forma, seja inserindo, atualizando ou excluindo dados.
Normalmente, não temos muito "controle" sobre transações, a menos que a gente explicite no nosso código que
queremos fazer isso.
Assim, a ideia de uma transação é agrupar um conjunto de instruções a serem executadas no banco de dados, e ter
a flexibilidade de:
Quando executamos as ações acima desta forma, não temos controle sobre desfazê-las ou salvá-las no banco, pois
as transações efetuadas estão implícitas (não declaradas). Mas, quando usamos transações explícitas, conseguimos
controlar melhor essas ações.
O que são TRANSACTIONS?
E este controle é possível por meio dos comandos:
BEGIN TRANSACTION: com ele informamos ao sistema que estamos iniciando uma transação;
ROLLBACK TRANSACTION: comando TCL que usamos para desfazer uma transação no banco;
COMMIT (TRANSACTION): comando TCL por meio do qual salvamos uma transação no banco.
BEGIN TRANSACTION, COMMIT e ROLLBACK
Para exemplificarmos como utilizamos os comandos apresentados na página anterior, inicialmente, vamos criar uma
nova tabela em nosso banco de dados, chamada cliente_aux que conterá os mesmos dados da tabela dCliente:
Para explicitarmos ao banco de dados que queremos iniciar uma transação, devemos utilizar o comando BEGIN
TRANSACTION (ou BEGIN TRAN, que também funciona da mesma forma).
Desta forma, temos a oportunidade de verificar se este registro está correto antes de executarmos a próxima ação.
E agora, temos duas opções:
Verificando que a inserção dos dados foi efetuada de acordo com o esperado, podemos salvá-la definitivamente
no banco de dados por meio de um COMMIT. Ou, percebendo que algo errado aconteceu, podemos desfazer esta
inserção por meio de um ROLLBACK.
BEGIN TRANSACTION, COMMIT e ROLLBACK
Vamos supor que verificamos que algo não saiu conforme o esperado e desejamos desfazer esta inserção.
Isto acontece porque, uma transação, uma vez iniciada, pode ser salva com um COMMIT ou desfeita com um
ROLLBACK. Enquanto não for efetuada nenhuma das duas ações, a transação permanece em aberto.
Porém, após executado um COMMIT ou um ROLLBACK, essa transação é encerrada. Portanto, se, após executado
um ROLLBACK, tentarmos efetuar um COMMIT, o sistema retornará o erro acima, pois a transação já havia sido
encerrada, não sendo mais possível efetuar nenhuma ação em relação a ela.
O contrário também vale: após um COMMIT, a transação é encerrada, não sendo possível efetuar um ROLLBACK.
BEGIN TRANSACTION, COMMIT e ROLLBACK
Agora, vamos executar novamente o nosso BEGIN TRANSACTION para efetuar a inserção do mesmo registro.
Assim, iniciaremos uma nova transação:
BEGIN TRANSACTION, COMMIT e ROLLBACK
Repare que o registro foi mais uma vez inserido na tabela cliente_aux:
BEGIN TRANSACTION, COMMIT e ROLLBACK
Porém, como já abordado anteriormente, sabemos que ele não está definitivamente salvo, pois o inserimos por
meio de uma transação explícita que iniciamos com o BEGIN TRANSACTION.
Desta forma, temos a oportunidade de verificar se este registro está correto antes de executarmos a próxima ação.
E agora, temos novamente duas opções:
Verificando que a inserção dos dados foi efetuada de acordo com o esperado, podemos salvá-la definitivamente
no banco de dados por meio de um COMMIT. Ou, percebendo que algo errado aconteceu, podemos desfazer esta
inserção por meio de um ROLLBACK.
BEGIN TRANSACTION, COMMIT e ROLLBACK
No exemplo anterior, havíamos desfeito a inserção com um ROLLBACK.
Agora, vimos que tudo saiu conforme o esperado, e por isso queremos salvar essa inserção definitivamente na
nossa tabela. Para isso, executamos um COMMIT:
Isto acontece porque, uma transação, uma vez iniciada, pode ser salva com um COMMIT ou desfeita com um
ROLLBACK. Enquanto não for efetuada nenhuma das duas ações, a transação permanece em aberto.
Porém, após executado um COMMIT ou um ROLLBACK, essa transação é encerrada. Portanto, se, após executado
um COMMIT, tentarmos efetuar um ROLLBACK, o sistema retornará o erro acima, pois a transação já havia sido
encerrada, não sendo mais possível efetuar nenhuma ação em relação a ela.
O contrário também vale: após um ROLLBACK, a transação é encerrada, não sendo possível efetuar um COMMIT.
Criando TRANSACTIONS nomeadas
Veremos agora que podemos criar transações nomeadas. O processo é o mesmo de se criar uma transação sem
nome. Devemos apenas acrescentar o nome que desejamos dar a ela logo após o BEGIN TRANSACTION, desta
forma:
Assim, quando formos efetuar um COMMIT ou um ROLLBACK nesta transação, informamos o nome dela junto ao
comando a ser executado:
COMMIT e ROLLBACK condicionais
Vamos agora a um exemplo um pouquinho mais complexo que os anteriores, em que estabeleceremos, dentro de
uma transação, uma condição para que uma inserção de dados seja ou salva de forma definitiva no banco de dados
(com um COMMIT), ou desfeita (com um ROLLBACK).
Suponhamos que a gente queira inserir no banco de dados uma cliente chamada Ruth Campos.
Só que, antes de executar um COMMIT, primeiro nós queremos saber se o cadastro dessa cliente já existe.
Para isso, podemos estabelecer uma condição: se o cadastro dessa cliente já existir, desfaça a transação; se não
existir, salve a transação.
3
COMMIT e ROLLBACK condicionais
4 Fazemos a contagem na tabela cliente_aux de todas as clientes que se chamam “Ruth Campos”, e armazenamos essa
contagem na variável @contador que criamos no início.
Repare que, conforme vimos anteriormente, até agora, não tínhamos nenhuma cliente chamada Ruth Campos
cadastrada na tabela cliente_aux.
Quando iniciamos a transação T1, inserimos um registro com os dados de uma cliente chamada Ruth Campos.
Portanto, agora, a nossa contagem (COUNT) verificará que existe o registro de uma cliente chamada Ruth Campos
na tabela cliente_aux, por isso armazenará na varíavel @contador o valor 1.
4
COMMIT e ROLLBACK condicionais
5 Continuamos agora estabelecendo a condição: 5
se a variável @contador for igual a 1, devemos
salvar definitivamente esse novo registro
executando um COMMIT na transação T1.
Além disso, imprimimos na tela a mensagem
“Ruth Campos cadastrada com sucesso.”
Pois bem. Se repararmos, agora, no código que foi utilizado para criação da tabela dCliente, veremos que a
coluna data_de_nascimento foi definida como do tipo DATE:
Tratamento de erros em TRANSACTIONS (TRY e CATCH)
Isso significa que a coluna data_de_nascimento da nossa tabela cliente_aux também é do tipo DATE, já que ela
foi criada com base em toda a estrutura e registros da tabela dCliente.
Vamos imaginar que descobrimos que a data de nascimento do cliente de ID número 4 estava incorreta e,
portanto, precisamos corrigir essa informação:
Tratamento de erros em TRANSACTIONS (TRY e CATCH)
Sabendo que a data de nascimento correta deste cliente é 15 de março de 1992, tentamos efetuar a seguinte
alteração:
Porém, conforme vimos, a coluna data_de_nascimento é do tipo DATE. Portanto, ela não aceitou a nova data de
nascimento informada no código acima, pois, da forma como ela foi passada, o sistema entendeu que se trata de
uma string (texto), não uma data. O correto seria ter informado 15/03/1992. Assim sendo, o sistema retornou o
seguinte erro:
Tratamento de erros em TRANSACTIONS (TRY e CATCH)
Todo sistema é passível de apresentar erros, por isso, é
muito importante que sejamos capazes de prever esses
erros, para que possamos criar mecanismos para trata-los
caso aconteçam. Assim, o sistema não será abortado,
pois saberá exatamente como proceder.
Repare que 0 linhas foram afetadas, pois o ROLLBACK definido no bloco CATCH foi efetuado.
E a mensagem “Data cadastrada inválida”, também definida no bloco CATCH, foi apresentada na tela, conforme
esperado.
Tratamento de erros em TRANSACTIONS (TRY e CATCH)
Se consultarmos a tabela cliente_aux, verificaremos que a data de nascimento do cliente de ID número 4
permanece inalterada:
Tratamento de erros em TRANSACTIONS (TRY e CATCH)
Se alterarmos a data informada no nosso código para o formato correto, para que o sistema a reconheça como
sendo do tipo DATE, a alteração será devidamente efetuada e salva com um COMMIT, conforme determinado pela
transação contida dentro do bloco TRY:
1 2
3
Variável @@TRANCOUNT
Conforme visto, quando iniciamos uma transação explícita, como temos feito neste módulo, ela fica em aberto
aguardando que executemos um COMMIT para salvá-la definitivamente no banco de dados, ou um ROLLBACK
para desfazê-la.
A variável @@TRANCOUNT pode ser muito útil quando queremos saber quantas transações temos em aberto
aguardando que executemos um COMMIT ou um ROLLBACK.
Vejamos:
Para iniciar, vamos utilizar a variável @@TRANCOUNT para nos mostrar que não existem transações em aberto:
Imprimindo novamente a variável @@TRANCOUNT, veremos que, agora, o sistema retornará o valor 2. Isso
significa que temos duas transações em aberto, que são exatamente a T1 e a T2 que inicializamos acima:
Variável @@TRANCOUNT
Vamos executar um COMMIT na transação T2:
Agora, se imprimirmos novamente a variável @@TRANCOUNT, veremos que o sistema retornará o valor 1. Isso
significa que temos apenas uma transação em aberto, que é a T1, já que a T2 acabamos de salvar e finalizar com
o COMMIT acima:
Variável @@TRANCOUNT
Por fim, vamos executar um ROLLBACK na transação T1:
Note que, se imprimirmos novamente a variável @@TRANCOUNT, veremos que o sistema retornará o valor 0.
Isso significa que finalmente não temos mais transações em aberto, pois a última transação que aguardava um
fechamento, a T1, foi desfeita e finalizada com o ROLLBACK que executamos acima:
Transações Aninhadas
TRANSACTIONS, além dos diversos tipos de comandos capazes de inserir, alterar ou excluir informações em um
banco de dados, também podem conter outras transações dentro de seu bloco de comandos. A essas transações
“uma dentro da outra”, chamamos de “transações aninhadas” (ou, em inglês, de nested transactions).
A grande diferença das transações aninhadas para as transações feitas separadamente (que temos visto até aqui) é
que, com as transações aninhadas, as transações mais internas, mesmo que contenham COMMITs ou ROLLBACKs,
só serão de fato salvas ou desfeitas quando a transação principal (mais externa) for salva com um COMMIT.
Caso a transação externa venha a ser desfeita com um ROLLBACK, tudo que tiver sido efetuado pelas transações
internas não será salvo, mesmo que estas transações internas contenham seus próprios COMMITs.
“999.999.999-99”.
2
Ao alterarmos o CPF do cliente de ID número 1 para 999.999.999-99, esta alteração foi inserida na tabela,
aguardando o COMMIT para ser salva de maneira definitiva, ou o ROLLBACK para ser desfeita:
Transações Aninhadas
Continuando na execução do nosso código, ao alterarmos o CPF do cliente de ID número 2 para 111.111.111-11,
esta alteração foi inserida na tabela e aparentemente salva, já que efetuamos um COMMIT ao final da T2:
Porém, para finalizar a T1, que é a nossa transação externa, na qual a T2 acima está contida, utilizamos um
ROLLBACK. Assim, ambas as alterações de números de CPFs que haviam sido efetuadas foram desfeitas, inclusive
a do ID número 2 (que foi efetuada e salva com um COMMIT pela T2), pois a T2 interna é dependente da T1
externa. Assim, uma vez efetuado um ROLLBACK na T1, também foi efetuado um ROLLBACK na T2:
TRANSACTIONS
Questão 1
EXERCÍCIOS 1 Crie uma tabela chamada Carro com os dados abaixo.
Obs.: não se preocupe com constraints, pode criar uma tabela simples.
Questão 2
2 Execute as seguintes transações no banco de dados, sempre na tabela
Carro. Lembre-se de dar um COMMIT para efetivar cada uma das
transações.
GABARITOS
Questão 1
1 Crie uma tabela chamada Carro com os dados abaixo.
GABARITOS
Questão 2.a
2.a Execute as seguintes transações no banco de dados, sempre
na tabela Carro. Lembre-se de dar um COMMIT para efetivar
cada uma das transações.
GABARITOS
Questão 2.b
2.b b) Atualizar o tipo do carro de id = 1 de Hatch para Sedan.
TRANSACTIONS
GABARITOS
Questão 2.c
2.c c) Deletar a linha referente ao carro de id = 6.
MÓDULO 21
Functions
O QUE VEREMOS NESTE MÓDULO
MÓDULO 21
O que são FUNCTIONS?
Uma FUNCTION é um conjunto de comandos que executam ações e retorna um valor escalar. As functions ajudam
a simplificar um código.
Por exemplo, se você tem um cálculo complexo que aparece diversas vezes no seu código, em vez de repetir várias
vezes aquela série de comandos, você pode simplesmente criar uma função e reaproveitá-la sempre que precisar.
O próprio SQL tem diversas funções do sistema (prontas) e, até agora, já vimos vários exemplos de funções deste
tipo, como funções de data, texto, etc.
O que são FUNCTIONS?
Podemos visualizar as funções do sistema na pasta Conforme formos criando nossas próprias funções,
Programação > Funções > Funções do Sistema: elas ficarão salvas na pasta Programação > Funções
> Funções com Valor Escalar:
Como criar e utilizar uma FUNCTION
Vamos imaginar que a gente queira fazer uma formatação diferenciada na coluna data_de_nascimento da tabela
dCliente. Em vez de retornar apenas a data conforme ela está armazenada (por exemplo, ‘1989-02-12’), queremos
retorná-la por extenso (assim: ‘Domingo, 12 de Fevereiro de 1989’).
Vimos no módulo de funções single row que podemos fazer isso por meio da função DATENAME, desta forma:
Como criar e utilizar uma FUNCTION
Porém, para facilitar para gente, nós podemos criar uma function que utilize a DATENAME e retorne este mesmo
resultado para qualquer coluna de data de qualquer tabela.
Assim, quando formos efetuar a consulta a uma tabela que contenha uma coluna de data que precisemos retornar
por extenso (como no caso da coluna data_de_nascimento da tabela dCliente), nós não precisamos recriar todo o
código com a DATENAME. Tudo que precisamos fazer é “chamar” dentro do nosso SELECT a função que tivermos
criado.
Entretanto, como uma boa prática, aconselhamos unir os comandos CREATE e ALTER sempre que formos criar ou
alterar uma FUNCTION.
Desta forma, não corremos o risco de querer criar uma function que já existe e retornar um erro, ou querer alterar
uma function que ainda não existe, incorrendo em novo erro:
Com o comando unificado CREATE OR ALTER FUNCTION, o sistema será capaz de verificar:
A. Se a function não existe, então ele criará uma nova function por meio do comando CREATE;
B. Se a function já existe, assim ele alterará a function já existente por meio do comando ALTER.
Como alterar uma FUNCTION
Dito isto, vamos alterar a function que criamos
para incluir na nossa string de data por extenso,
também a informação de semestre.
Questão 1
EXERCÍCIOS 1 Crie uma Function que calcule o tempo (em anos) entre duas datas.
Essa function deve receber dois argumentos: data_inicial e data_final.
Caso a data_final não seja informada, a function deve automaticamente
considerar a data atual do sistema.
Essa function será usada para calcular o tempo de casa de cada
funcionário.
Obs.: a função DATEDIFF não é suficiente para resolver este problema.
Questão 2
2 Crie uma function que calcula a bonificação de cada funcionário (5% a
mais em relação ao BaseRate).
Porém, tome cuidado! Nem todos os funcionários deverão receber
bônus...
FUNCTIONS
Questão 3
EXERCÍCIOS 3 Crie uma Function que retorna uma tabela. Esta function deverá receber
como parâmetro o gênero do cliente e retornar todos os clientes que
são do gênero informado na function.
Observe que esta function será utilizada particularmente na tabela
DimCustomer.
Questão 4
4 Crie uma Function que retorna uma tabela-resumo com o total de
produtos por cores.
Sua function deve receber 1 argumento, em que será possível
especificar de qual marca você deseja o resumo.
FUNCTIONS
GABARITOS
Questão 1
1 Crie uma Function que calcule o tempo (em anos) entre duas
datas.
Essa function deve receber dois argumentos: data_inicial e
data_final.
Caso a data_final não seja informada, a function deve
automaticamente considerar a data atual do sistema.
Essa function será usada para calcular o tempo de casa de cada
funcionário.
Obs.: a função DATEDIFF não é suficiente para resolver este
problema.
FUNCTIONS
GABARITOS
Questão 2
2 Crie uma function que calcula a bonificação de cada
funcionário (5% a mais em relação ao BaseRate).
GABARITOS
Questão 3
3 Crie uma Function que retorna uma tabela. Esta function
deverá receber como parâmetro o gênero do cliente e retornar
todos os clientes que são do gênero informado na function.
GABARITOS
Questão 4
4 Crie uma Function que retorna uma tabela-resumo com o total
de produtos por cores.
Procedures
O QUE VEREMOS NESTE MÓDULO
MÓDULO 22
O que são PROCEDURES?
Uma PROCEDURE é um bloco de código que possui um nome e pode ser armazenado no banco de dados.
Ele pode incluir uma série de comandos SQL para executar alguma tarefa.
Procedures são usadas para fazer tarefas repetitivas que não são possíveis em queries do SQL ou que
dariam muito trabalho.
Na PROCEDURE sem parâmetros, todas as informações necessárias para sua execução serão atribuídas dentro da
própria PROCEDURE.
Suponhamos que a gente queira criar uma procedure para armazenar uma consulta à tabela dGerente.
O código ficaria assim:
4
Como criar PROCEDURES SEM PARÂMETROS
Para executar nossa procedure, utilizamos o seguinte comando:
Agora, toda vez que precisarmos visualizar o resultado dessa mesma consulta, basta utilizarmos o comando
acima e executar a procedure prOrdenaGerentes, em vez de ter que recriar todo o código novamente.
Como criar PROCEDURES COM UM PARÂMETRO
Vamos agora avançar um pouquinho aprendendo a criar uma PROCEDURE COM UM PARÂMETRO.
Suponhamos que a gente queira criar uma procedure para armazenar uma consulta à tabela dCliente que
retorne apenas os clientes ou do sexo masculino, ou do sexo feminino, a depender do que for informado pelo
usuário.
O código ficaria conforme ao lado.
OU.
Agora, toda vez que precisarmos visualizar o resultado dessa mesma consulta, basta utilizarmos o comando
acima e executar a procedure prListaClientes, em vez de ter que recriar todo o código novamente.
Como criar PROCEDURES COM MAIS DE UM PARÂMETRO
Avancemos novamente mais um pouquinho para aprender como podemos criar uma PROCEDURE COM MAIS
DE UM PARÂMETRO.
Vamos imaginar que a gente queira, lá na nossa procedure prListasClientes, além de poder filtrar nossos clientes
por gênero, também escolher o ano de sua data de nascimento. Vamos precisar incluir mais um parâmetro,
então, concorda?
Agora, toda vez que precisarmos visualizar o resultado dessa mesma consulta, basta utilizarmos o comando
acima e executar a procedure prListaClientes, em vez de ter que recriar todo o código novamente.
Como criar PROCEDURES COM PARÂMETRO DEFAULT
E continuemos avançando! Agora, vamos ver como podemos passar um valor padrão (default) para um
parâmetro. Esse valor default será sempre utilizado caso o usuário não informe nenhum valor para o parâmetro
em questão.
Vamos imaginar que a gente queira alterar novamente a nossa procedure prListasClientes, para podermos incluir
o valor “M” como default do parâmetro @gen. Assim, caso o usuário não informe nenhum valor, sempre
retornaremos os clientes do gênero masculino na consulta efetuada pela procedure.
Porém, agora, como definimos um valor default para o parâmetro @gen, não somos obrigados a informar
novamente o valor “M” caso a gente queira retornar clientes do gênero masculino. Em um caso assim, basta
informarmos o ano de nascimento. Só precisamos informar o gênero se quisermos que apareçam as clientes do
gênero feminino (F) em vez dos clientes do gênero masculino (M).
Então, se quisermos retornar os clientes do gênero masculino que nasceram no ano de 1989 é só escrever o
código abaixo, certo?
Errado!
Repare que, se executarmos o código acima, o sistema retornará o seguinte erro:
Como criar PROCEDURES COM PARÂMETRO DEFAULT
Isso acontece porque, como a nossa procedure prListaClientes possui dois parâmetros, quando informamos
apenas um valor ao comando EXECUTE, o sistema não sabe para qual parâmetro ele deve passar aquele valor.
Ele não entende que, uma vez que existe um parâmetro com um valor default, se informamos apenas um valor,
este valor deve ser passado ao parâmetro que não tem valor default.
Então, para que o erro da página anterior não ocorra, temos que informar ao EXECUTE a qual parâmetro aquele
valor se refere, desta forma:
Perceba que, agora, o sistema entendeu e retornou todos os clientes do gênero masculino que nasceram em
1989:
Como criar PROCEDURES COM PARÂMETRO DEFAULT
E para retornar as clientes do gênero feminino que nasceram em 1989, por exemplo?
Neste caso, como teremos que, obrigatoriamente, informar valores tanto para o parâmetro @gen quanto para o
parâmetro @ano, não faz diferença se informamos o nome do parâmetro no comando EXECUTE ou não:
OU.
Perceba que, agora, o sistema retornou todas as clientes do gênero feminino que nasceram em 1989.
Portanto, o parâmetro default passado dentro da procedure só é utilizado quando o usuário não informa
nenhum valor para aquele parâmetro. Caso o usuário informe um valor diferente, é este valor que prevalece,
não o default.
Como criar PROCEDURES COMPLEXAS
Agora, vamos ver um exemplo de uma procedure um pouco mais complexa que as anteriores.
Com esta nova procedure, nós poderemos efetuar cadastros de assinatura de novos contratos na tabela
fContratos.
Como exemplo, ao final, executada a procedure, nós cadastraremos os seguintes dados informados pelo usuário
para um novo contrato:
dCliente dGerente
Como criar PROCEDURES COMPLEXAS
Como sabemos, as colunas de id_cliente e id_gerente das tabelas dCliente e dGerente são as chaves primárias
dessas tabelas, às quais as chaves estrangeiras id_cliente e id_gerente da tabela fContratos fazem referência:
dCliente
fContratos
dGerente
Como criar PROCEDURES COMPLEXAS
Portanto, se queremos que os nomes informados pelo usuário para cliente e gerente sejam considerados para
cadastrarmos os IDs desses nomes corretamente na tabela fContratos, precisamos, por meio dos nomes
informados pelo usuário, conseguir extrair os IDs das tabelas dCliente e dGerente correspondentes a esses
nomes para poder salvá-los no registro do novo contrato assinado.
E é isso que a nossa nova procedure vai ser capaz de fazer. Para tanto, precisaremos seguir o seguinte passo a
passo:
2º Passo: Armazenar em uma das variáveis definidas no 1º passo o valor de id_gerente da tabela dGerente de
acordo com o nome do gerente informado pelo usuário;
3º Passo: Armazenar na outra variável definida no 1º passo o valor de id_cliente da tabela dCliente de acordo
com o nome do cliente informado pelo usuário;
3 Dentro do bloco de execução, declaramos as variáveis que vamos precisar. No caso, utilizaremos duas: uma para
armazenar o id_gerente da tabela dGerente que estiver associado ao nome do gerente informado pelo usuário; e
outra para armazenar o id_cliente da tabela dCliente que estiver associado ao nome do cliente informado pelo
usuário;
3
Como criar PROCEDURES COMPLEXAS
Continuando o bloco de execução, vamos agora incluir dois SELECTs:
4
8
Como criar PROCEDURES COMPLEXAS
Ao executarmos o comando EXECUTE com os valores informados pelo usuário...
... note que a mensagem configurada no PRINT da procedure prRegistraContrato foi impressa na tela, conforme
esperado...
Como criar PROCEDURES COMPLEXAS
... e o novo registro foi devidamente incluído na tabela fContratos:
Como criar PROCEDURES COMPLEXAS
Vejamos nas tabelas dCliente e dGerente se extraímos os IDs corretos.
Portanto, na tabela dCliente o cliente de ID nº 7 tem que ser o Gustavo Barbosa; e na tabela dGerente o gerente
de ID nº 1 precisa ser o Lucas Sampaio, pois foram estes os nomes informados pelo usuário aos parâmetros
@cliente e @gerente no nosso EXECUTE, lembra-se? Veja:
Como criar PROCEDURES COMPLEXAS
Vamos ver se é isso mesmo:
Questão 1
EXERCÍCIOS 1 Crie uma Procedure que resume o total de produtos por nome da
categoria. Essa Procedure deve solicitar ao usuário qual marca deve ser
considerada na análise.
Questão 2
2 Crie uma Procedure que lista os top N clientes de acordo com a data de
primeira compra. O valor de N deve ser um parâmetro de entrada da sua
Procedure.
Questão 3
3 Crie uma Procedure que recebe 2 argumentos: MÊS (de 1 a 12) e ANO
(1996 a 2003). Sua Procedure deve listar todos os funcionários que
foram contratados no mês/ano informado.
PROCEDURES
Observação:
EXERCÍCIOS Para os exercícios 4, 5 e 6 utilize a tabela abaixo:
PROCEDURES
Questão 4
EXERCÍCIOS 4 Crie uma Procedure que insere uma nova linha na tabela Carro. Essa
nova linha deve conter os seguintes dados:
- id = 5
- placa = GOL-5555
- modelo = Volkswagen Gol
- tipo = Hatch
- valor = 80000
Questão 5
5 Crie uma Procedure que altera o valor de venda de um carro. A
Procedure deve receber como parâmetros o id_carro e o novo valor.
Questão 6
6 Crie uma Procedure que exclui um carro a partir do id informado.
PROCEDURES
GABARITOS
Questão 1
1 Crie uma Procedure que resume o total de produtos por nome
da categoria. Essa Procedure deve solicitar ao usuário qual
marca deve ser considerada na análise.
PROCEDURES
GABARITOS
Questão 2
2 Crie uma Procedure que lista os top N clientes de acordo com
a data de primeira compra. O valor de N deve ser um
parâmetro de entrada da sua Procedure.
PROCEDURES
GABARITOS
Questão 3
3 Crie uma Procedure que recebe 2 argumentos: MÊS (de 1 a
12) e ANO (1996 a 2003). Sua Procedure deve listar todos os
funcionários que foram contratados no mês/ano informado.
PROCEDURES
GABARITOS
Questão 4
4 Crie uma Procedure que insere uma nova linha na tabela
Carro. Essa nova linha deve conter os seguintes dados:
- id = 5
- placa = GOL-5555
- modelo = Volkswagen Gol
- tipo = Hatch
- valor = 80000
PROCEDURES
GABARITOS
Questão 5
5 Crie uma Procedure que altera o valor de venda de um carro. A
Procedure deve receber como parâmetros o id_carro e o novo
valor.
PROCEDURES
GABARITOS
Questão 6
6 Crie uma Procedure que exclui um carro a partir do id
informado.
MÓDULO 23
Triggers DML
O QUE VEREMOS NESTE MÓDULO
MÓDULO 23
O que são TRIGGERS DML?
Uma TRIGGER é um gatilho que será disparado automaticamente quando acontecer um evento.
Uma TRIGGER DML é disparada quando um comando INSERT, UPDATE ou DELETE é executado em uma Tabela
ou View.
Antes de continuarmos, um parêntese: existem também as Triggers DDL que são disparadas quando utilizamos
comandos DDL (CREATE, ALTER, DROP). Mas este será assunto para o próximo módulo. Neste aqui, vamos
focar nas Triggers DML.
Prossigamos: na hora de criar uma TRIGGER DML, podemos definir alguns elementos:
TIPO (em relação ao evento): AFTER (depois) ou INSTEAD OF (no lugar de);
Essa trigger será disparada após (AFTER) um evento INSERT, UPDATE ou DELETE ser executado na tabela
dCliente e imprimirá na tela uma mensagem informando que os dados dessa tabela foram alterados.
Vejamos um exemplo com o comando INSERT. Vamos incluir o seguinte registro na tabela dCliente:
Por exemplo:
Quando efetuássemos um INSERT INTO, aparecesse a mensagem “Os dados foram inseridos na tabela!”;
Já quando dados fossem atualizados com um UPDATE, mostrássemos na tela “Os dados foram atualizados na
tabela!”;
E, por fim, quando registros fossem excluídos por meio de um DELETE, avisássemos que “Os dados foram
excluídos da tabela!”.
Só que, para fazer isso, precisamos antes entender sobre a existência das tabelas INSERTED e DELETED.
Tabelas INSERTED e DELETED
No SQL Server, existem duas tabelas pré-configuradas, chamadas INSERTED e DELETED que, todas as vezes
que efetuamos um comando DML (INSERT, UPDATE ou DELETE), elas recebem os dados que foram ou
inseridos, ou atualizados, ou excluídos, a depender do comando que foi utilizado.
Suponhamos que a gente queira alterar a trigger tgClienteAlterado para, em vez de apresentar na tela aquela
mensagem genérica que os dados foram alterados, mostrar os próprios dados que foram inseridos na tabela
dCliente toda vez que executarmos um INSERT.
... repare que o resultado serão os próprios dados que foram inseridos na tabela dCliente:
Isso aconteceu porque, toda vez que inserimos um dado em alguma tabela, esse registro também fica
temporariamente armazenado na tabela INSERTED. Como incluímos um SELECT a essa tabela (INSERTED) no
bloco de comandos da trigger tgClienteAlterado, quando disparada, ela mostrou como resultado o registro que a
tabela INSERTED acabou de temporariamente armazenar.
Tabelas INSERTED e DELETED
Agora, vamos supor que queremos novamente alterar a trigger tgClienteAlterado para, a partir de agora,
apresentar na tela os dados que foram excluídos da tabela dCliente toda vez que executarmos um DELETE.
... repare que o resultado serão os próprios dados que foram excluídos na tabela dCliente:
Isso aconteceu porque, toda vez que excluímos algum dado de uma tabela, esse registro também fica
temporariamente armazenado na tabela DELETED. Como incluímos um SELECT a essa tabela (DELETED) no
bloco de comandos da trigger tgClienteAlterado, quando disparada, ela mostrou como resultado o registro que a
tabela DELETED acabou de temporariamente armazenar.
Tabelas INSERTED e DELETED
Já parou para pensar que quando atualizamos uma tabela, temos dois registros? O novo que foi inserido na
tabela, e o antigo que foi excluído da tabela para dar lugar ao novo.
Com isso em mente, vamos imaginar que queremos, por fim, alterar a trigger tgClienteAlterado para, a partir de
agora, apresentar na tela os dados que foram inseridos na tabela dCliente e os que foram excluídos da tabela
dCliente toda vez que executarmos um UPDATE.
... o resultado será o registro que foi incluído na tabela dCliente e também o que foi excluído da tabela dCliente:
1) Se a trigger for de INSERT, a tabela INSERTED terá registros e a tabela DELETED ficará vazia;
2) Se a trigger for de DELETE, a tabela INSERTED ficará vazia e a tabela DELETED terá registros;
Quando efetuarmos um INSERT, queremos que apareça na tela a mensagem “Os dados foram inseridos na
tabela!”;
Já quando atualizarmos algum registro com um UPDATE, queremos mostrar na tela que “Os dados foram
atualizados na tabela!”;
E, por fim, quando excluirmos dados por meio de um DELETE, queremos avisar que “Os dados foram excluídos
da tabela!”.
Tabelas INSERTED e DELETED
Para isso, vamos alterar a trigger tgClienteAlterado para deixa-la da seguinte forma:
3
Tabelas INSERTED e DELETED
4 Iniciamos o bloco de comandos com o comando BEGIN; 4
Veja só que a mensagem “Os dados foram inseridos na tabela!” apareceu na tela, conforme esperado:
Tabelas INSERTED e DELETED
Vamos testar agora o comando UPDATE:
Repare que a mensagem “Os dados foram atualizados na tabela!” apareceu na tela, conforme esperado:
Tabelas INSERTED e DELETED
Por fim, testemos o comando DELETE:
Note que a mensagem “Os dados foram excluídos da tabela!” apareceu na tela, conforme esperado:
Como criar uma TRIGGER DML (INSTEAD OF)
Vamos partir agora para a criação de uma Trigger DML do tipo INSTEAD OF. Este tipo de trigger efetua alguma
ação no lugar do comando DML especificado, toda vez que uma determinada condição for atendida.
1
2
3
Como criar uma TRIGGER DML (INSTEAD OF)
4 Iniciamos o bloco de comandos com o comando BEGIN; 4
5
5 Dentro do bloco de comandos, executamos um IF para
verificar se o dia de hoje (GETDATE) é sábado ou 6
domingo:
6 Se for, utilizamos a instrução RAISERROR para
exibir um erro na tela com a seguinte mensagem:
“O cadastro de clientes só pode ser feito de 7
segunda à sexta”, e efetuamos um ROLLBACK
para que o INSERT efetuado seja desfeito;
7 Se não for sábado nem domingo, efetuamos o 8
Se hoje for sábado ou domingo, repare que a trigger disparada retornará o erro configurado, conforme
esperado:
Como criar uma TRIGGER DML (INSTEAD OF)
Além disso, como foi efetuado o ROLLBACK configurado na trigger, o novo registro também será desfeito, não
sendo salvo na tabela dCliente. Veja:
Como criar uma TRIGGER DML (INSTEAD OF)
Porém, caso hoje não seja sábado nem domingo, repare que, executado o INSERT...
Para habilitar novamente todas as triggers DML de uma tabela utilizamos a seguinte sintaxe:
Por fim, para excluir uma trigger DML, utilizamos a seguinte sintaxe:
Triggers DDL
O QUE VEREMOS NESTE MÓDULO
MÓDULO 24
O que são TRIGGERS DDL?
Como sabemos, uma TRIGGER é um gatilho que será disparado automaticamente quando acontecer um evento.
Vimos no módulo anterior as Triggers DML, que podem ser disparadas quando os comandos DML INSERT,
UPDATE ou DELETE são executados em uma Tabela ou View.
Agora, vamos entender como funcionam as TRIGGERS DDL, que podem ser disparadas quando executamos os
comandos DDL CREATE, ALTER ou DROP.
Como criar TRIGGERS DDL
Enquanto que, para configurar as triggers DML, nós visamos uma tabela, para criar triggers DDL, nós levamos
em consideração o banco de dados em si.
Vamos a um exemplo:
Queremos agora criar uma trigger que impeça a inclusão, alteração ou exclusão de tabelas no banco de dados
Exercícios (que viemos utilizando nos últimos módulos).
Portanto, primeiro devemos ter a certeza que o banco de dados Exercícios está selecionado. Para isso, verifique
na barra Editor SQL se aparece o nome Exercícios, conforme abaixo:
Como criar TRIGGERS DDL
Feito isso, vamos criar o seguinte código:
3 Acrescentamos o comando FOR e informamos os comandos DDL que serão capazes de disparar a nossa trigger
quando forem executados. No caso CREATE_TABLE, ALTER_TABLE e DROP_TABLE;
5 Inserimos, dentro do bloco de comandos, um PRINT para informar na tela que “Não é permitido criação, alteração
ou exclusão de tabelas”; além disso, efetuamos um ROLLBACK para desfazer a tentativa de criação, alteração ou
exclusão de tabela que havia sido executada, causando o disparo da trigger;
6 Finalizamos o bloco de comandos com o comando END.
Como criar TRIGGERS DDL
Para testar nossa trigger tgRecusarTabelas, vamos tentar criar a tabela abaixo:
Para habilitar novamente todas as triggers DDL de um banco de dados utilizamos a seguinte sintaxe:
Por fim, para excluir uma trigger DDL, utilizamos a seguinte sintaxe:
Pivot Table
O QUE VEREMOS NESTE MÓDULO
MÓDULO 25
O que é uma PIVOT TABLE?
A PIVOT TABLE é uma tabela criada a partir da inversão de uma outra 1
tabela.
2
Como criar uma PIVOT TABLE
Vamos entender como conseguimos transformar a consulta mostrada na página anterior naquela PIVOT TABLE.
Neste primeiro exemplo, vamos fazer isso de uma forma um tanto quanto manual, apenas para entendermos melhor
como tudo funciona. Mais para frente, aprenderemos a fazer essa obtenção de forma dinâmica.
2
Limitações de uma PIVOT TABLE
Lembra-se que utilizamos o código abaixo para conseguir retornar os nomes dos departamentos que queríamos
ver na PIVOT TABLE?
Lembra-se também que dissemos que esta era uma forma manual de fazer a
extração dos dados de uma coluna?
Obtendo os dados desta forma, por não ser dinâmica, caso ocorra alguma
alteração na tabela original, essa mudança não será repassada à PIVOT TABLE
que criamos.
Portanto, é importante que a gente aprenda como fazer essa obtenção de forma
mais automática e otimizada, para que a nossa PIVOT TABLE não fique limitada
aos dados extraídos no momento da criação de seu código.
Corrigindo as limitações de uma PIVOT TABLE
Inicialmente, precisamos encontrar uma forma dinâmica 1
Depois, faremos um SELECT que retornará a variável @NomeColunas para que ela vá recebendo departamento
distinto por departamento distinto e vá armazenando, um a um, seguido de uma vírgula concatenada 2 . Repare
que, aqui, utilizamos uma subquery para retornar os departamentos distintos da coluna DepartmentName da
tabela DimEmployee e a utilizamos como a tabela da nossa consulta principal 3 .
Por fim, vamos retirar a última vírgula concatenada após o último departamento armazenado na variável
@NomeColunas. Para isso, basta utilizarmos a função LEFT 4 .
Corrigindo as limitações de uma PIVOT TABLE
Se fizermos um PRINT da variável @NomeColunas, repare que será retornada uma string com os nomes de todos os
departamentos entre colchetes, separados por vírgulas, exatamente como precisamos passar ao operador IN do
código da PIVOT TABLE:
Corrigindo as limitações de uma PIVOT TABLE
Só que não podemos simplesmente pegar a variável @NomeColunas e passar para o operador IN do código da
nossa PIVOT TABLE, pois não é aceito. Veja que, se executarmos o código dessa forma, será retornado um erro:
Corrigindo as limitações de uma PIVOT TABLE
Para que o nosso código da PIVOT TABLE funcione, vamos ter que conseguir transformar o próprio código (da
PIVOT TABLE) em uma string (texto) para poder concatená-lo com a variável @NomeColunas, e armazenar tudo
isso em uma outra variável, que vamos chamar de @SQL.
Bom, para isso, precisamos passar a variável @SQL como parâmetro a uma procedure do sistema chamada
sp_executesql, dessa forma:
Corrigindo as limitações de uma PIVOT TABLE
Executando todo o código (desde a declaração das variáveis, até o EXECUTE da procedure sp_executesql)...
Corrigindo as limitações de uma PIVOT TABLE
... teremos, finalmente, nossa PIVOT TABLE!
Agora nosso código está totalmente dinâmico. Assim, caso seja alterada qualquer informação da tabela
DimEmployee, seja em sua estrutura, sejam nos dados armazenados, tudo será automaticamente atualizado toda
vez que executarmos o código da página anterior. Dessa forma, teremos nossa PIVOT TABLE sempre atualizada.
SQL
IMPRESSIONADOR
Apostila Completa de SQL Server