Buscar

SQL - PART 3

Prévia do material em texto

S Q L B Á S I C O – P A R T E 3
Na primeira parte aprendemos:
Responder vários tipos de perguntas de negócio
Consultas básicas
Agregações
Operações matemáticas
Pesquisas aproximadas
Na parte 3 vamos finalmente aprender a fazer consultas em 
mais de uma tabela
Mas antes vamos de conteúdo SALADÃO, com vários 
comandos e operadores importantes no dia a dia e que
não abordamos nas outras duas aulas
“Começou de novo??” Não, você não está no vídeo errado
Você SEMPRE precisa parar e se questionar o porquê de estar estudando 
as coisas. A quantidade de materiais, algoritmos e técnicas é tão grande 
nessa área que nos perdemos facilmente e fazemos cursos “por fazer”: 
pare com isso
Para ser um bom cientista de dados, SQL é uma forma simples e rápida de 
extrair conhecimento de valor de bases de dados. 
Bancos de dados relacionais estão por toda a parte e saber consultá-los 
com destreza* é essencial
* Gastei o portuga hein! Vai dizer?!
Fazer uma maniçoba deliciosa! (mentira, é que estou com 
fome)
Saber consultar resultados com linhas sem repetições 
(comando DISTINCT)
Fazer filtros de linhas com muitas opções, sem precisar de 
TRILHÕES DE OR, OR, OR.... (operador IN)
Responder nossas perguntas de negócio utilizando mais de 
uma tabela!! FINALMENTE (junção, comando JOIN) 
“Esse nerd endoidou, esqueceu que falou disso na outra aula”
Padawan, na parte 2 vimos como fazer a contagem de valores 
não nulos de uma coluna, com o COUNT(DISTINCT coluna_x), 
lembram?
Agora vamos ver o comando DISTINCT para mostrar as linhas 
sem valores repetidos!
nome musica nota estilo
The Beatles Get Back 10 Rock
The Beatles Something 10 Rock
Radiohead Weird Fishes 9.99999 indie rock
Radiohead Karma Police 9.99999 indie rock
The Cure Mint Car 9.98888 gothic rock
The Cure Charlotte Sometimes 9.98888 gothic rock
The Cure A Letter To Elise 9.98887 gothic rock
SELECT nome, nota, estilo
FROM bandas
WHERE nota > 9.99
nome nota estilo
The Beatles 10 Rock
The Beatles 10 Rock
Radiohead 9.99999 indie rock
Radiohead 9.99999 indie rock
SELECT nome, nota, estilo
FROM bandas
WHERE nota > 9.99
nome nota estilo
The Beatles 10 Rock
Radiohead 9.99999 indie rock
SELECT DISTINCT nome, nota, estilo
FROM bandas
WHERE nota > 9.99
nome nota estilo
The Cure 9.98888 gothic rock
The Cure 9.98888 gothic rock
The Cure 9.98887 gothic rock
SELECT nome, nota, estilo
FROM bandas
WHERE estilo = ‘gothic rock’
banda nota estilo
The Cure 9.98888 gothic rock
The Cure 9.98887 gothic rock
SELECT DISTINCT banda, nota, estilo
FROM bandas
WHERE estilo = ‘gothic rock’
-- “Uai, duas linhas?!”
-- rá, padawan, e esse 7 diferente do 8?!
-- btw, isso é um comentário em vários bancos de dados, 
-- só usar dois hífens no início (cada banco tem sua sintaxe de comentário)
Lembram dos múltiplos filtros? No WHERE podemos incluir 
vários filtros de linhas, utilizando AND e o OR. 
Imagine que tenhamos uma tabela de clientes de vários estados
id nome cpf idade sexo uf
1 Leoncio 111.111.111-11 21 M GO
2 Mariazinha 333.333.232-22 19 F RJ
3 Joaozinho 843.937.17-53 27 Sim, por favor SP
4 Jack 222.222.222-22 17 M SP
5 Joe 444.444.444-44 16 M DF
6 Joanna 555.555.555-55 22 F CE
7 Josefina 666.666.666-66 56 F AP
Se eu quisesse um filtro com para buscar clientes de Goiás, São 
Paulo e Amapá. Na parte 2 a gente viu que podemos usar o OR, 
certo? (afinal ninguém mora em 3 lugares ao mesmo tempo)
SELECT *
FROM clientes
WHERE uf = ‘GO’ OR uf = ‘SP’ OR uf = ‘AP’
Pois um jeito menos verborrágico (isso existe?) é utilizando o 
operador IN. Ele é bem simples de usar e evitar ficar repetindo 
OR, OR, OR toda hora
SELECT *
FROM clientes
WHERE uf IN (‘GO’, ‘SP’, ‘AP’)
Legal que podemos também utilizar a exclusão, ou seja, 
podemos selecionar todos os clientes que NÃO SÃO de Goiás e 
nem do Pará (pô, que preconceito é esse, eu adoro pequi e 
maniçoba*)
SELECT *
FROM clientes
WHERE uf NOT IN (‘GO’, ‘PA’)
* É sério, maniçoba é BOM DEMAIS
Um comando para todas as tabelas 
governar,
Um comando para encontrá-las, 
Um comando para todas trazer e na 
comparação de chaves juntá-las, 
na Terra de Bancos de Dados, 
onde os cientistas de dados trabalham 
(Tolkien goiano)
No mundo maravilhoso do Leon, SQL é lindo, fácil e 
conseguimos responder todas as perguntas de negócio e obter 
os melhoooooores insights usando uma tabelinha só (relacional 
hein, galera, olha o respeito)
A vida real é DURA e muito dificilmente teremos todas as 
respostas num lugar só todo bonitinho
Aqui surge o grande poder do SQL: a junção de tabelas
Ainda no mundo real, as informações normalmente são separadas em 
tabelas distintas e, quando precisamos de informações demais de uma 
tabela, precisamos de junções
Uma forma comum de organização dos bancos de dados é utilizando as 
formas normais propostas por Edgard Codd
Sem entrar em detalhes enfadonhos (mas importantes hein!), as formas 
normais tentam evitar repetições desnecessárias (ex: tabela de municípios 
com códigos, ao invés de sempre escrever “São José do Vale do Rio Preto”*)
* Diz o google que é o maior nome de município do Brasil (se você é daí, manda um alô nos comentários :D)
Isso faz com que as tabelas sejam “pequenas” em número de colunas e bastante 
autocontidas. Os relacionamentos com outras tabelas se dá por meio de códigos
As tabelas somente com os códigos e descrições são normalmente chamadas de 
“tabelas de domínio”
Exemplo de tabelas de domínio: municípios, ufs, países, produtos, tipos de conta 
bancária
É bastante comum termos que buscar as descrições nas tabelas de domínio e, para 
isso, precisamos utilizar a junção
id nome
1 Leoncio
2 Mariazinha
3 Joaozinho
4 Jack
5 Joe
6 Joanna
7 Juan
id nome_produto
1 Pringles
2 Alface
3 Coca cola
4 Ruffles
5 Bolinhas do capeta 
da Lindt
clientes produtos
Come só 
mais uma...
Vc tá 
magrinho,
bobo!
compras
id_cliente id_produto quantidade
1 1 5
1 3 10
1 5 973519459
2 2 15
3 1 2
3 4 3
id nome
1 Leoncio
2 Mariazinha
3 Joaozinho
4 Jack
5 Joe
6 Joanna
7 Juan
id nome
1 Pringles
2 Alface
3 Coca cola
4 Ruffles
5 Bolinhas do capeta 
da Lindt
clientes
produtos
Percebam que agora temos somente a indicação de índices na tabela 
compras, sem o nome do cliente ou do produto. Para saber o nome de um 
produto de uma compra, por exemplo, precisamos de DUAS TABELAS: 
compras e produtos
Mais ainda, perceberam que nas duas tabelas teremos identificadores que 
se relacionam? Na tabela compras temos id_produto que REFERENCIA o id 
da tabela de produtos.
compras
id_cliente id_produto quantidade
1 1 5
1 3 10
1 5 973519459
2 2 15
3 1 2
3 4 3
id nome_produto
1 Pringles
2 Alface
3 Coca cola
4 Ruffles
5 Bolinhas do capeta 
da Lindt
produtos
compras
id_cliente id_produto quantidade
1 1 5
1 3 10
1 5 973519459
2 2 15
3 1 2
3 4 3
id nome_produto
1 Pringles
2 Alface
3 Coca cola
4 Ruffles
5 Bolinhas do capeta 
da Lindt
produtos
Os nomes das colunas que se referenciam são diferentes (id_produto em 
clientes e id em produtos). Por isso é importante saber a correlação 
SEMÂNTICA entre os ids. Isso porque nem sempre os identificadores terão 
nomes bonitinhos que nem os que fiz pra vocês
Por exemplo, correlacionar id_produto na tabela de compras não tem nada a 
ver com id do cliente
Da mesma forma, temos a referência na tabela compras ao identificador do 
cliente
compras
id_cliente id_produto quantidade
1 1 5
1 3 10
1 5 973519459
2 2 15
3 1 2
3 4 3
id nome
1 Leoncio
2 Mariazinha
3 Joaozinho
4 Jack
5 Joe
6 Joanna
7 Juan
clientes
compras
id_cliente id_produto quantidade
1 1 5
1 3 10
1 5 973519459
2 2 15
3 1 2
3 4 3
id nome
1 Leoncio
2 Mariazinha
3 Joaozinho
4 Jack
5 Joe
6 Joanna
7 Juan
clientes
Agora que entendemos a SEMÂNTICA da junção, vamos ver como 
fazermos isso usando SQL
Vou jogar o comando aqui, mas não se assuste, vamos mostrar passo 
a passo. Inclusive temos que conhecer um conceito importante antes 
de entender completamentecomo funciona a junção, e será um 
diferencial no seu entendimento (quero que me cobrem depois se 
não facilita o entendimento!!)
Vamos ao exemplo: consultar o nome de todos produtos e 
quantidades em todas as compras registradas
SELECT *
FROM tabela1 JOIN tabela2 ON tabela1.id_x = tabela2.id_y
SELECT *
FROM tabela1 JOIN tabela2 ON tabela1.id_x = tabela2.id_y
O comando JOIN faz a junção das tabelas 1 e 2, utilizando como 
critério de junção (ON), o id_x da tabela1 e o id_y da tabela2
Vamos a um exemplo para ficar mais fácil: consultar o nome de todos 
produtos e quantidades em todas as compras registradas
01 – em que tabelas estão os dados necessários?
02 – você precisa de todas as linhas ou precisa de um filtro?
03 – você precisa de todas as colunas ou somente de 
algumas?
01 – em que tabelas estão os dados necessários? 
Tabelas compras e produtos!
02 – você precisa de todas as linhas ou precisa de um filtro? 
Quero todas as linhas, não tem filtro!
03 – você precisa de todas as colunas ou somente de algumas? 
Só duas colunas: nome do produto e a quantidade!
01 – em que tabelas estão os dados necessários? 
SELECT * 
FROM compras JOIN produtos ON compras.id_produto = produtos.id
TABELA 1 TABELA 2 CRITÉRIO DE 
JUNÇÃO
02 – você precisa de todas as linhas ou precisa de um filtro? 
SELECT * 
FROM compras JOIN produtos ON compras.id_produto = produtos.id
03 – você precisa de todas as colunas ou somente de algumas? 
SELECT produtos.nome, compras.quantidade
FROM compras JOIN produtos ON compras.id_produto = produtos.id
-- perceba que o nome da coluna tem um prefixo agora!
-- como podemos ter colunas de mesmo nome em tabelas diferentes
-- é importante sempre indicar a tabela à qual a coluna pertence
E se eu quiser agora... o nome dos produtos para cada compra 
registrada no nome do cliente “Leoncio”???
E AGORA?!
E AGORA?!
Do tio Leon, deve se 
lembrar você! Com 
SELECT * FROM 
começar você deve!
01 – em que tabelas estão os dados necessários? 
Tabelas compras, produtos e clientes!
02 – você precisa de todas as linhas ou precisa de um filtro? 
Somente as compras do cliente “Leoncio”! Tem filtro!
03 – você precisa de todas as colunas ou somente de algumas? 
Só duas colunas: nome do produto e a quantidade!
01 – em que tabelas estão os dados necessários? 
SELECT * 
FROM compras JOIN produtos ON compras.id_produto = produtos.id
JOIN clientes ON compras.id_cliente = clientes.id
02 – você precisa de todas as linhas ou precisa de um filtro? 
SELECT * 
FROM compras JOIN produtos ON compras.id_produto = produtos.id
JOIN clientes ON compras.id_cliente = clientes.id
WHERE clientes.nome = “Leoncio”
03 – você precisa de todas as colunas ou somente de algumas? 
SELECT produtos.nome, compras.quantidade
FROM compras JOIN produtos ON compras.id_produto = produtos.id
JOIN clientes ON compras.id_cliente = clientes.id
WHERE clientes.nome = “Leoncio”
ACABOOOOOU!!!
(mentira, na parte 4 tem 
outros tipos de join, mas basta 
a cada dia o seu mal)
Consultar resultados com linhas sem repetições (comando 
DISTINCT)
Fazer filtros de linhas com muitas opções, sem precisar de 
TRILHÕES DE OR, OR, OR.... (operador IN)
Responder nossas perguntas de negócio utilizando mais de 
uma tabela!! FINALMENTE (junção, comando JOIN) 
Se inscrever no canal!
Ativar o sininho (pra ser alertado da parte 4!!)
Baixando os slides no link na descrição!
Ambiente SQL
• https://www.w3schools.com/
SQL ANSI/ISO
• Lista de documentos: 
https://docs.oracle.com/database/121/SQLRF/ap_standard_sql001.htm#SQLRF55514 
• ANSI: https://www.ansi.org/resource-center (Família ANSI/ISO/IEC 9075)

Continue navegando