Você está na página 1de 51

SQL BÁSICO – PARTE 4

Na 3 primeiras partes aprendemos:

Responder vários tipos de perguntas de negócio


Consultas básicas
Agregações
Operações matemáticas
Pesquisas aproximadas
Junção de duas ou mais tabelas (inner join)
Na parte 4 vamos descobrir que existem vários tipos de junção! E todos
são importantes não só para SQL, mas para manipulação de dados
tabulares de tudo que é tecnologia!

Fechamos nosso mini-curso de SQL com as consultas aninhadas e o


comando WITH. Tudo isso pra você ter mais ferramentas na hora de
responder às perguntas de negócio da sua empresa.

Ainda temos um bônus com vários comandos que considero úteis para o
nosso dia a dia e que ainda não apresentei nos outros vídeos
Realizar consultas onde todos os elementos de uma tabelas
aparecem, mesmo que haja junção com outras tabelas (ex:
fazer um relatório de vendas de empregados, trazendo TODOS
os nomes e vendas, até os nomes daqueles que não venderam
nada no período)

Utilizar consultas aninhadas como se fossem tabelas (pode ser


útil em muitos casos onde a periodicidade da tabela principal e
aninhada são diferentes, ex: uma tabela está com vendas
trimestrais e outra está mensal)
Utilizar subconsultas como novas tabelas temporárias (WITH)

Unir linhas de consultas diferentes num resultado só (UNION e


UNION ALL)

Colocar a MÃO NA MASSA: FAZER SUAS PRÓPRIAS


CONSULTAS
E se eu te falar que.... eu te enganei
Na parte 3 vimos como juntar duas ou mais tabelas para trazer resultados
de diferentes lugares para responder uma consulta

Agora que você já entendeu como faz (se ainda não, volta lá na parte 3, link
da descrição), vou dizer a verdade pra você....

Existem diversos tipos de junção. O que aprendemos na parte 3 é chamado


de INNER JOIN

Na inner join que aprendemos, a ordem de junção não importa,


porque o resultado sempre traz a intersecção de duas tabelas

Entenderam???????
“Sim, Leon, tudinho....”
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 1 15
id nome
3 1 2
1 Pringles
3 4 3
2 Alface
3 Coca cola
4 Ruffles
5 Bolinhas do capeta
da Lindt
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” compras

nome quantidade
Pringles 5
Coca Cola 10
Bolinhas do capeta 973519459
da Lindt
O INNER JOIN vai trazer as intersecções das tabelas com base nos critérios
de junção

Nem sempre esse tipo de junção consegue responder a todas as nossas


questões.

Quanto temos questões onde queremos que TODOS os elementos de uma


tabela sejam apresentados, e não somente os da intersecção, temos que
utilizar outros tipos de junção

Exemplo: Se eu quiser saber todas as quantidades de produtos


vendidos e, mesmo que não haja nenhuma venda, quero que
o nome do produto apareça no resultado final, com quantidade 0
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, com nomes de todos os produtos

03 – você precisa de todas as colunas ou somente de algumas?


Somente nome de produto e
a soma das quantidades
01 – em que tabelas estão os dados necessários?

SELECT *
FROM compras
JOIN produtos ON compras.id_produto = produtos.id
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, SUM(compras.quantidade)


FROM compras
JOIN produtos ON compras.id_produto = produtos.id
GROUP BY produtos.nome

-- Agrupamos por nome de produto para somar


-- as quantidades de itens vendidos
03 – você precisa de todas as colunas ou somente de algumas?

SELECT produtos.nome, SUM(compras.quantidade)


FROM compras
JOIN produtos ON compras.id_produto = produtos.id
GROUP BY produtos.nome

nome SUM(quantidade)
Pringles 22
Coca Cola 10
Ruffles 3
Bolinhas do capeta 973519459
da Lindt
Esse resultado tá certo???

nome SUM(quantidade)
Pringles 22
Coca Cola 10
Ruffles 3
Bolinhas do capeta 973519459
da Lindt
Esse resultado tá certo??? Vamos lembrar da tabelas de produtos

produtos resultado
id nome nome SUM(quantidade)
1 Pringles Pringles 22
2 Alface Coca Cola 10
3 Coca cola Ruffles 3
4 Ruffles Bolinhas do capeta 973519459
5 Bolinhas do capeta da Lindt
da Lindt
Porque o INNER JOIN, padawan, somente traz a intersecção entre as
tabelas juntadas! E o que isso quer dizer?? Vamos rever as tabelas de
compras e produtos
produtos compras
id nome id_cliente id_produto quantidade
1 Pringles 1 1 5
2 Alface ???? 1 3 10
3 Coca cola 1 5 973519459
4 Ruffles 2 1 15
5 Bolinhas do capeta 3 1 2
da Lindt
3 4 3
Como fazer para aparecer
o “delicioso” alface???
Outra forma de realizar junções entre tabelas é a junção à esquerda!

O nome referencia à posição porque a tabela que fica do lado ESQUERDO


terá TODAS AS SUAS LINHAS incluídas no resultado final!

Se houver correlação entre a linha da tabela à esquerda com alguma linha


da tabela da direita os campos da tabela da esquerda são preenchidos, mas
se não houver correlação, o resultado continua retornando uma linha, mas
com valores nulos para os campos da tabela da esquerda
Agora que você já sabe a sintaxe do INNER JOIN, vai ser fácil entender
do LEFT JOIN, vamos fazer uma consulta usando o exemplo dos
produtos e compras (e da maravilhosa alface)

SELECT produtos.nome, SUM(compras.quantidade)


FROM produtos
LEFT JOIN compras ON compras.id_produto = produtos.id
GROUP BY produtos.nome
Basta adicionar o LEFT e PENSAR EM QUEM DEVE FICAR À ESQUERDA! Isso
faz toda a diferença. Como nossa consulta quer as quantidades de TODOS
os produtos, devemos colocar a tabela produtos à esquerda

SELECT produtos.nome, SUM(compras.quantidade)


FROM produtos
LEFT JOIN compras ON compras.id_produto = produtos.id
GROUP BY produtos.nome
SELECT produtos.nome, SUM(compras.quantidade)
FROM produtos
LEFT JOIN compras ON compras.id_produto = produtos.id
GROUP BY produtos.nome

nome SUM(quantidade)
Pringles 22
Alface 0
Coca Cola 10
Ruffles 3
Bolinhas do capeta 973519459
da Lindt
Vamos tirar o agrupamento para ver linha a linha das compras?
Relembrando como é a tabela de compras

compras
id_cliente id_produto quantidade
1 1 5
1 3 10
1 5 973519459
2 1 15
3 1 2
3 4 3
Vamos tirar o agrupamento para ver linha a linha das compras? Primeiro
com o INNER JOIN

SELECT produtos.nome, compras.quantidade nome quantidade

FROM produtos Pringles 5

INNER JOIN compras ON compras.id_produto = produtos.id Coca Cola 10


Bolinhas do capeta 973519459
da Lindt
Pringles 15
-- sim, padawan, você também pode escrever INNER JOIN
Pringles 2
-- é o mesmo que o nosso velho conhecido JOIN
Ruffles 3
Agora com o LEFT JOIN, para que TODOS OS PRODUTOS apareçam

SELECT produtos.nome, compras.quantidade nome quantidade


FROM produtos Pringles 5
LEFT JOIN compras ON compras.id_produto = produtos.id Pringles 15
Pringles 2

Alface NULL
Coca Cola 10
Ruffles 3
Bolinhas do capeta 973519459
da Lindt
Legal? Entenderam a diferença?

O LEFT JOIN dá um outro poder para o cientista de dados, padawan!

Agora conseguimos fazer relatórios de vendas por empregados, por


exemplo! Os empregados que não tiveram nenhuma venda, não
apareceriam num resultado com INNER JOIN, mas com LEFT JOIN ele
vai estar lá! (coitados, nem deu pra aliviar a barra deles)
Estava sentindo falta! Mas agora com tantos conceitos abstratos,
merece um w3schools pra gente treinar!!!

Vamos lá fazer umas consultas que precisam de junção de tabelas,


tanto junções internas (as “normais”) quanto junções à esquerda

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_wildcard_charlist
Já que mostramos a junção “normal” e a junção à esquerda, vamos
mostrar pra vocês outros os tipos de junção

Na prática, na práaaaaatica mesmo, difícil a gente precisar de mais do


que isso. Quando estiverem lá já passaram do básico.

Mas somente para saberem que existe com uma explicação rápido,
vamos lá...
É possível utilizar uma consulta como se fosse uma tabela! Dá
pra usar no FROM, chamar por um nome e tudo!

Ex:

SELECT *
FROM (SELECT * FROM cliente WHERE uf = ‘GO’) as clientes_goianos;
Vamos ver um exemplo prático no w3schools, corre lá!
É possível utilizar uma consulta como se fosse uma tabela
temporária com o comando WITH.

Ex:

WITH
clientes_goianos AS (SELECT * FROM cliente WHERE uf = ‘GO’)
SELECT * FROM clientes_goianos;
Bora treinar o WITH no w3schools!!
UNION e UNION ALL: juntam linhas de tabelas diferentes! Mas as
colunas e tipos tem que ser os mesmos!! Ex: unir os CPFs e
nomes dos professores e alunos de uma escola

UNION: faz um DISTINCT no resultado, ou seja, elimina linhas


duplicadas

UNION ALL: não faz o DISTINCT e traz todas as linhas


alunos_com_L
id nome nome_municipio
1 Leoncio Santa Terezinha de Goiás
alunos_com_J
id nome nome_municipio
3 Joaozinho Santo Antonio do Aracangua
4 Jack Santo Antonio do Aracangua
5 Joe Santo Antonio do Aracangua
6 Joanna Aparecida de Goiânia
7 Juan Pedra Branca do Amapari
SELECT nome_municipio FROM alunos_com_L nome_municipio
UNION Santa Terezinha de Goiás
Santo Antonio do Aracangua
SELECT nome_município FROM alunos_com_J
Aparecida de Goiânia
Pedra Branca do Amapari
SELECT nome_municipio FROM alunos_com_L nome_municipio
Santa Terezinha de Goiás
UNION ALL Santo Antonio do Aracangua
SELECT nome_município FROM alunos_com_J Santo Antonio do Aracangua
Santo Antonio do Aracangua
Aparecida de Goiânia
Pedra Branca do Amapari
Padawans, o curso está chegando ao fim! Antes de fechar
esse carinha, queria que percebessem que, em todos os
vídeos, fizemos somente consultas. A gente não alterou os
bancos de dados em nenhum momento, somente
extraímos dados.

Na impede que tenhamos a permissão e necessidade de


CRIAR E ALTERAR TABELAS. Em SQL, os comandos que
alteram o banco são chamados de DDL (data definition
language)
Precisaríamos de muito mais tempo pra mostrar todas as
formas de criação e alteração de tabelas, inserção de dados,
remoção de dados e tabelas...

Ademais, estamos um curso básico para ciência de dados.


Portanto, vou mostrar pra vocês uma forma bem usual e
simples de criar tabelas: utilizando os resultados da sua
própria consulta.
Exemplo de criação da tabela (usar o comando CREATE
TABLE):

CREATE TABLE clientes_goianos AS


SELECT * FROM cliente WHERE uf = ‘GO’

-- molezinha, né?
Vamos uma última vez para o w3schools:
Realizar consultas com diferentes tipos de junção!

Utilizar consultas aninhadas como se fossem tabelas!

Utilizar consultas temporárias!

Unir linhas de consultas diferentes num resultado só (UNION e UNION ALL)


Colocar a MÃO NA MASSA: FAZER SUAS PRÓPRIAS CONSULTAS

Não pare de estudar, quando a gente para tem que retomar


quase do zero: espiral de conhecimento é o que você deve buscar

Já está empregado: veja como SQL pode ajudar no lugar onde


trabalha, busque saber se sua empresa tem bancos de dados e
comece a fazer suas consultas

Não está empregado: refaça as consultas do w3schools; faça


perguntas de negócio na base que vimos lá e tente solucionar
usando SQL
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