Você está na página 1de 52

SQL BÁSICO – PARTE 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
SELECT nome, nota, estilo The Beatles Get Back 10 Rock

FROM bandas The Beatles Something 10 Rock


Radiohead Weird Fishes 9.99999 indie rock
WHERE nota > 9.99 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
nome nota estilo
SELECT nome, nota, estilo The Beatles 10 Rock
FROM bandas The Beatles 10 Rock

WHERE nota > 9.99 Radiohead 9.99999 indie rock


Radiohead 9.99999 indie rock
SELECT DISTINCT nome, nota, estilo nome nota estilo

FROM bandas The Beatles 10 Rock


Radiohead 9.99999 indie rock
WHERE nota > 9.99
SELECT nome, nota, estilo nome nota estilo
The Cure 9.98888 gothic rock
FROM bandas The Cure 9.98888 gothic rock
WHERE estilo = ‘gothic rock’ The Cure 9.98887 gothic rock
SELECT DISTINCT banda, nota, estilo banda nota estilo
FROM bandas The Cure 9.98888 gothic rock
The Cure 9.98887 gothic rock
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
clientes produtos
id nome id nome_produto
1 Leoncio 1 Pringles
2 Mariazinha 2 Alface
3 Joaozinho 3 Coca cola
4 Jack 4 Ruffles
5 Joe 5 Bolinhas do capeta
6 Joanna da Lindt

7 Juan Come só
mais uma...
Vc tá
magrinho,
bobo!
clientes
id nome
1 Leoncio
2 Mariazinha
3 Joaozinho
compras 4 Jack
5 Joe
id_cliente id_produto quantidade
6 Joanna
1 1 5
7 Juan
1 3 10
1 5 973519459 produtos
2 2 15
id nome
3 1 2
1 Pringles
3 4 3
2 Alface
3 Coca cola
4 Ruffles
5 Bolinhas do capeta
da Lindt
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 produtos
id_cliente id_produto quantidade id nome_produto
1 1 5 1 Pringles
1 3 10 2 Alface
1 5 973519459 3 Coca cola
2 2 15 4 Ruffles
3 1 2 5 Bolinhas do capeta
da Lindt
3 4 3
compras produtos
id_cliente id_produto quantidade id nome_produto
1 1 5 1 Pringles
1 3 10 2 Alface
1 5 973519459 3 Coca cola
2 2 15 4 Ruffles
3 1 2 5 Bolinhas do capeta
da Lindt
3 4 3
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 clientes
id_cliente id_produto quantidade id nome
1 1 5 1 Leoncio
1 3 10 2 Mariazinha
1 5 973519459 3 Joaozinho
2 2 15 4 Jack
3 1 2 5 Joe
3 4 3 6 Joanna
7 Juan
compras clientes
id_cliente id_produto quantidade id nome
1 1 5 1 Leoncio
1 3 10 2 Mariazinha
1 5 973519459 3 Joaozinho
2 2 15 4 Jack
3 1 2 5 Joe
3 4 3 6 Joanna
7 Juan
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 completamente como 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?!
Do tio Leon, deve se
lembrar você! Com
SELECT * FROM
começar você deve!

E AGORA?!
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)

Você também pode gostar