Você está na página 1de 48

SQL BÁSICO – PARTE 2

Na primeira parte aprendemos:

O que é SQL? (síquol!)


Consultas básicas
Responder perguntas de negócio com agregações
Na parte 2 (a missão) você vai ser capaz de responder
perguntas de negócio utilizando SQL:

Com múltiplos filtros (ex: clientes de SP ou RJ com idade acima


de 30)
Com cálculos matemáticos e estatísticos (ex: média de idade de
uma turma)
Com filtros aproximados (ex: pacientes que contenham joão no
nome)
Com múltiplas agregações (ex: agrupar produtos por
fornecedores e transportadores)
Na vida de cientista de dados será MUITO comum você ter que
criar filtros diferentes para analisar os dados, buscar insights e
responder algumas perguntas de negócio

A gente já viu como fazer um filtro para linhas sem agregação


com o WHERE

Não vimos muitos exemplos, no entanto, de múltiplos filtros.


Vamos fazer isso agora! Para combinar critérios de filtros
utilizamos as palavras-chave AND e OR
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 SP
6 Joanna 555.555.555-55 22 F GO
7 Josefina 666.666.666-66 56 F AP
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 SP
6 Joanna 555.555.555-55 22 F GO
7 Josefina 666.666.666-66 56 F AP
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?
Tabela clientes!

02 – você precisa de todas as linhas ou precisa de um filtro?


Dois filtros: sexo e idade!

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


Só duas colunas: cpf e nome!!
01 – em que tabelas estão os dados necessários?
SELECT * FROM clientes

02 – você precisa de todas as linhas ou precisa de um filtro?


SELECT * FROM clientes WHERE sexo = ‘F’ AND idade > 20

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


SELECT cpf, nome FROM clientes WHERE sexo = ‘F’ AND idade > 20
SELECT cpf, nome cpf nome
FROM clientes 555.555.555-55 Joanna

WHERE sexo = ‘F’ AND idade > 20 666.666.666-66 Josefina


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 SP
6 Joanna 555.555.555-55 22 F GO
7 Josefina 666.666.666-66 56 F AP
01 – em que tabelas estão os dados necessários?
Tabela clientes!

02 – você precisa de todas as linhas ou precisa de um filtro?


Dois filtros: uf e idade!

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


Só duas colunas: nome e idade!!
01 – em que tabelas estão os dados necessários?
SELECT * FROM clientes

02 – você precisa de todas as linhas ou precisa de um filtro?


SELECT * FROM clientes WHERE (uf = ‘SP’ OR uf = ‘GO’) AND idade <= 22

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


SELECT nome, idade FROM clientes
WHERE (uf = ‘SP’ OR uf = ‘GO’) AND idade <= 22
SELECT nome, idade nome idade uf
Leoncio 21 GO
FROM clientes Jack 17 SP
WHERE (uf = ‘SP’ OR uf = ‘GO’) Joe 16 SP
AND idade <= 22 Joanna 22 GO
“E esses parênteses aí? Entendi foi nada!!”

Tá mole, padawan, vamos tirar os parênteses e ver no que dá!


nome idade uf
SELECT nome, idade Leoncio 21 GO
FROM clientes Joaozinho 27 SP
WHERE uf = ‘SP’ OR uf = ‘GO’ Jack 17 SP
Joe 16 SP
AND idade <= 22 Joanna 22 GO
Muitos das consultas que fazemos no dia a dia requerem filtros
que não sejam exatos! Filtros aproximados são úteis para buscar
informações importantes dentro de bancos de dados

Alguns exemplos:
Selecionar clientes que tenham “Madalena” no endereço?

Selecionar pacientes que tenham a 2ª letra igual a “a”? (“pra que


isso mesmo???” Sei lá, só pra mostrar que tem jeito de fazer :P)

Selecionar alunos com nome começando com M ou L?


Usar o operador especial LIKE + caracteres CORINGA!
Caracteres coringa:

% - substitui qualquer caractere em qualquer


quantidade
_ - substitui um caractere qualquer (somente um!)
[abc] – alternativas, qualquer um dentro dos colchetes
vale

(na real na real mêeeees, a gente só usa o %)


nome endereço
João Boça R. Dep. Lacerda Franco, 596 – Vila Madalena – São Paulo - SP
Maria Concurseira SQSWSQD- Quadra 2027 – Sem Esquina – Brasília – DF
Dercy dos Risos R. Cel. Manoel de Portugal, 1055 - Santa Maria Madalena - RJ
Jacinto Aquino 200 5th Ave, New York, NY, United States
Alvus Dumbledore Rua da Magia 444, Cemitério de Hogwarts, Inglaterra
Joanna Av. Antônio Costa Vieira, 305 - Pinhos, Madalena – CE
SELECT nome nome
FROM clientes João Boça
WHERE endereço LIKE ‘%Madalena%’ Dercy dos Risos
Joanna
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 SP
6 Joanna 555.555.555-55 22 F GO
7 Josefina 666.666.666-66 56 F AP
SELECT * FROM alunos nome cpf
Joaozinho 843.937.17-53
WHERE nome LIKE ‘_o%’
Joe 444.444.444-44
Joanna 555.555.555-55
Josefina 666.666.666-66
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 SP
6 Joanna 555.555.555-55 22 F GO
7 Josefina 666.666.666-66 56 F AP
nome idade
SELECT * FROM alunos
Leoncio 21
WHERE nome LIKE ‘[ML]%’ Mariazinha 19
Bora de W3Schools??

Se perder o link na parte 1, taí de novo! (baixe os slides no link


abaixo!!)

https://www.w3schools.com/sql/trysql.asp?filename=trysql_selec
t_wildcard_charlist
Na parte 1 do curso, falamos de algumas funções somente em
exemplos de agregação!

Agora que já entendemos bem a agregação, podemos conhecer


melhor funções matemáticas e de estatística descritiva sem
precisar utilizar o GROUP BY

As funções mais utilizadas são: COUNT, AVG, MAX, MIN, STDEV

Com essas funções nosso leque de ferramentas melhora


bastante no caminho para entender melhor nossos dados
COUNT: conta o número de linhas ou os valores não nulos

“Hein??”

Vamos detalhar direitinho que tem muito marmanjo e marmanja


que até hoje não sabe a diferença do COUNT(*) para o
COUNT(coluna)

Pois no Let’s Data a gente cuida direitinho de vocês e vão


sair sabendo mais que muita gente tirando onda por aí
Não contei pra vocês, mas no mundo real, nem todos os campos das
tabelas estão preenchidos direitinho. Muitos campos podem ter
valores nulos
id nome cpf idade
1 Leoncio 111.111.111-11 21
2 Mariazinha NULL 19
3 Joaozinho 843.937.17-53 27
4 Jack 222.222.222-22 17
5 Joe NULL 16
6 Joanna 555.555.555-55 22
7 Josefina 666.666.666-66 56
Se fizer um SELECT COUNT(*), ele vai retornar a contagem de linhas.
Todas as linhas independente de ter valores nulos ou não

SELECT COUNT(*) id nome cpf idade


1 Leoncio 111.111.111-11 21
FROM alunos 2 Mariazinha NULL 19
3 Joaozinho 843.937.17-53 27
RESULTADO: 7 4 Jack 222.222.222-22 17
5 Joe NULL 16
6 Joanna 555.555.555-55 22
7 Josefina 666.666.666-66 56
Se fizer um SELECT COUNT(nome), ele vai retornar a contagem de
todos as linhas que tem nomes os preenchidos. Nesse caso, dá o
mesmo resultado que COUNT(*)
SELECT COUNT(nome) id nome cpf idade
1 Leoncio 111.111.111-11 21
FROM alunos 2 Mariazinha NULL 19
3 Joaozinho 843.937.17-53 27
RESULTADO: TAMBÉM 7 4 Jack 222.222.222-22 17
(tá me enganando, prof??) 5 Joe NULL 16
6 Joanna 555.555.555-55 22
7 Josefina 666.666.666-66 56
Se fizer um SELECT COUNT(cpf), ele vai retornar a contagem de todos
as linhas que tem cpfs preenchidos. Nesse caso, o resultado é
DIFERENTE de COUNT(*)

SELECT COUNT(cpf) id nome cpf idade


1 Leoncio 111.111.111-11 21
FROM alunos 2 Mariazinha NULL 19
3 Joaozinho 843.937.17-53 27
RESULTADO: 5 4 Jack 222.222.222-22 17
(rá, agora sim!) 5 Joe NULL 16
6 Joanna 555.555.555-55 22
7 Josefina 666.666.666-66 56
“E se eu quiser o número de valores sem repetição, Leon??”

Boa pergunta, padawan! Vou mostrar mais à frente, mas podemos contar
valores únicos utilizando o DISTINCT
Vejam essa tabela de registro de
nome dia entrada Saida
entrada e saída de uma academia.
John 2020-05-02 10:45 13:50

Como contar o número de pessoas John 2020-05-03 09:47 11:22

que frequentam a academia? (meu Mary 2020-05-03 17:53 18:27


nome claramente não está aí :P) John 2020-05-04 12:22 15:17
Susan 2020-05-05 07:12 08:05
O DISTINC é usado para retornar valores únicos, sem repetição. Vamos
ver alguns outros exemplos, mas na contagem, temos que passar a
palavra-chave DENTRO do COUNT. É meio esquisito, mas a gente se
acostuma

SELECT COUNT(DISTINCT nome) nome dia entrada Saida


FROM alunos John 2020-05-02 10:45 13:50
John 2020-05-03 09:47 11:22
RESULTADO: 3 Mary 2020-05-03 17:53 18:27
(Mary, Susan e o maníaco do John) John 2020-05-04 12:22 15:17
Susan 2020-05-05 07:12 08:05
AVG: calcula a média da coluna selecionada

Molezinha? A gente já tinha visto com GROUP BY, pra quem entendeu
isso na parte 1, agora é mais fácil ainda

O AVG vai ignorar valores NULOS e desconsiderá-los na hora de calcular a


média.
Lá no intermediário, ou avançado, a gente
mostra como fazer pra ele contar o NULO como
sendo 0, mas por enquanto o importante é saber NULL
que ele não tá nem aí pro NULO (tadinho)
AVG: Calcular a média de idade dos alunos

id nome cpf idade


1 Leoncio 111.111.111-11 21
2 Mariazinha NULL 19
3 Joaozinho 843.937.17-53 27
4 Jack 222.222.222-22 17
5 Joe NULL 16
6 Joanna 555.555.555-55 22
7 Josefina 666.666.666-66 56
Calcular a média de idade dos alunos

SELECT AVG (idade) AVG(idade)

FROM alunos 25,42


MAX e MIN, precisa explicar não né?

id nome cpf idade


SELECT MAX (idade)
1 Leoncio 111.111.111-11 21
FROM alunos 2 Mariazinha NULL 19
3 Joaozinho 843.937.17-53 27
4 Jack 222.222.222-22 17
SELECT MIN (idade)
5 Joe NULL 16
FROM alunos 6 Joanna 555.555.555-55 22
7 Josefina 666.666.666-66 56
MAX e MIN, precisa explicar não né?

SELECT MAX (idade) MAX(idade)


FROM alunos 56

SELECT MIN (idade) MIN**(idade)

FROM alunos 16*

* No vídeo eu falei 17, mas é 16!


** No vídeo está MAX(idade), mas é MIN(idade)
STDEV: calcula o desvio padrão da coluna selecionada

Conceito de estatística que apresenta o quão variados e dispersos estão


os dados
STDEV: só pra dar uma noção, sem pânico

Vejam que a média é a


mesma (0), mas a variação
em torno da média é bem
diferente. Quanto menor o
desvio padrão (SD) mais
concentrados em torno da
média estão os dados
STDEV: só pra dar uma noção, sem pânico

Ex: imagine que a média de idade


de uma faculdade é 22 anos, e que
a média de idade da cidade inteira
é também 22. Qual das duas
amostras terá o maior desvio
padrão?
STDEV: só pra dar uma noção, sem pânico

Ex: Como na faculdade as


idades são mais “próximas”,
com menor variação, também
será menor o desvio padrão
da idade!

Uma cidade inteira possui


recém nascidos e idosos
centenários, o que aumenta o
desvio padrão
Bora de W3Schools??

“De novo??”

Tá achando que vai ficar vendo vídeo sem treinar, padawan???


Pode tirar o cavalo da chuva, cientista de dados tem que por a
MÃO NA MASSA! Vamo que vamo

https://www.w3schools.com/sql/trysql.asp?filename=trysql_selec
t_wildcard_charlist
Conceito importante, agregar várias linhas.... peraí, a gente já viu
isso na parte 1!!!

Vamos rever esse conceito rapidamente e fazer alguns exercícios


para fixar um dos conceitos mais importantes em SQL

Claro, rever com EXERCÍCIOS: bora de w3schools!!

https://www.w3schools.com/sql/trysql.asp?filename=trysql_selec
t_wildcard_charlist
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