Parte 1: Comandos essenciais em SQL para análise de dados
O SQL (Structured Query Language) é uma linguagem amplamente utilizada para analisar dados nos mais distintos tipos de negócios. Além do uso amplo, é uma linguagem muito amigável e com o aprendizado da sintaxe básica, já permite a qualquer pessoa realizar consultas simples.
Nesse artigo, vamos ver alguns comandos que são bem importantes na construção de uma consulta no banco, com o objetivo de analisar dados.
Mas antes disso, alguns pontos são bem importantes:
- No aprendizado de qualquer linguagem, a primeira coisa a se considerar é se a mesma é case sensitive ou não, ou seja, se ela faz diferenciação entre maiúsculas e minúsculas. No caso do SQL, existe essa diferenciação, mas os principais comandos que vamos abordar não são case sensitive;
- Uma boa prática é escrever todos os comandos em maiúscula, pois isso facilita a leitura e a identificação;
- Um equívoco muito comum é confundir a linguagem com os sistemas de gerenciamento de bancos de dados que implementam o SQL. MySQL, PostgreSQL, Oracle e SQLite são exemplos de sistemas usados.
Agora vamos conhecer comandos e outros conhecimentos importantes para a análise de negócios e algumas possíveis aplicações no dia-a-dia.
- SELECT
É uma instrução que permite a seleção de informações de uma ou várias tabelas.
SELECT order_id, costumer_id
FROM orders
;
Associado ao elemento *, a instrução SELECT permite recuperar todas as colunas e todas as linhas de uma tabela. É uma boa prática utilizar esse recurso associado à instrução LIMIT, que limitará a quantidade de linhas que a consulta irá trazer.
Uma boa prática ao se iniciar uma análise de exploratória de dados é utilizar o código do comando abaixo para visualizar a disposição das informações na tabela. Com essa análise é possível verificar: quais informações nas colunas serão utilizadas no filtro, qual é o nome da coluna que será utilizada para cruzar a tabela analisada com outras tabelas, dentre outras possíveis análises.
SELECT *
FROM orders
LIMIT 1000;
--comando LIMIT utilizado para tornar a consulta mais eficiente
2. WHERE
Este comando permite filtrar as linhas de uma tabela de acordo com as condições desejadas.
A condição para realizar a filtragem pode conter vários operadores lógicos e aqui cito alguns:
- Os operadores
=
,<
,>
,<=
,>=
e<>
; - Os operadores lógico
AND
eOR
; BETWEEN
,LIKE
,IS NOT NULL
eIS NULL
.
A seguir, serão mostrados alguns blocos de código usando o comando WHERE que podem ajudar muito no dia-a-dia na extração de dados e análise de negócios.
a) Selecionando os ids de clientes que realizaram pedidos maiores que um determinado valor
SELECT customer_id
FROM orders
WHERE paid > 200
;
b) Selecionando os ids de clientes que realizaram pedidos entre uma faixa de valor
SELECT customer_id
FROM orders
WHERE paid BETWEEN 200 AND 600
;
c) Selecionando os ids dos clientes cujos nomes começam com a letra ‘A’ e o final do customer_id é igual a 2
SELECT customer_id
FROM orders
WHERE name LIKE 'A%'
AND RIGHT(user_id,1) = 9
;
d) Selecionando os clientes onde o order_id é não nulo
SELECT customer_id
FROM orders
WHERE order_id IS NOT NULL
;
3. Funções de Agregação SUM, AVG, COUNT, MAX e MIN
São funções muito importantes em consultas e análises simples. Elas são usadas para realizar cálculos estatísticos:
- SUM: somar;
- AVG: calcular a média;
- COUNT: contagem de valores;
- COUNT(DISTINCT costumer_id): contagem de valores únicos;
- MAX: retorna o valor máximo;
- MIN: retorna o valor mínimo.
Importante: quando usamos funções de agregação e selecionamos outras colunas, é necessário fazer uso do GROUP BY para agrupar a outra coluna. O exemplo a do artigo demonstra isso de forma prática.
a) Somando o valor total pago nos pedidos por tipo de produto
SELECT type
,SUM(paid) as valor_pago
FROM orders
GROUP BY type
;
b) Encontrando o valor máximo e mínimo pago em um pedido
SELECT MIN(paid)
,MAX(paid)
FROM orders
;
4. JOIN
O JOIN é uma instrução que permite combinar informações de duas ou mais tabelas, dado uma coluna chave presente em ambas tabelas.
No exemplo abaixo, estamos realizando uma seleção de dados únicos usando o GROUP BY e a chave de cruzamento entre a tabela consumers
e a tabela transactions
.
Nota: por menos intuitivo que seja, o código do exemplo a seguir funciona semelhante à instrução DISTINCT e retira as duplicações do código.
SELECT consumer_id
,customer_email
,customer_phone
FROM consumers a
JOIN transactions on a.consumer_id = b.consumer_id
GROUP BY 1,2,3
Existem vários tipos de JOINs, mas não vamos tratá-los de forma exaustiva por aqui. Com o INNER JOIN e LEFT JOIN, a maioria das análises de negócios são possíveis.
a) INNER JOIN
De forma resumida, essa instrução traz na consulta apenas as linhas que são correspondentes nas tabelas e exclui o que não é.
SELECT a.consumer_id
FROM consumers a
INNER JOIN orders b
ON a.consumer_id = b.consumer_id
;
No exemplo, a consulta retorna os clientes que realizaram ao menos um pedido.
b)LEFT JOIN
Usando essa instrução, todas as linhas da tabela da esquerda e as linhas correspondentes na tabela da direita são retornadas.
SELECT a.consumer_id
FROM consumers a
LEFT JOIN orders b
ON a.consumer_id = b.consumer_id
;
No exemplo, a tabela consumers
é a tabela da esquerda e a orders
a da direita. A consulta retorna todas as linhas da tabela consumers e as linhas correspondentes da tabela orders. A chave para o cruzamento entre as tabelas é o consumer_id.
c) Outros JOINs
Outros JOINs citados em livros e artigos que tratam a respeito da linguagem SQL é o RIGHT JOIN, FULL JOIN e CROSS JOIN.
5. CASE WHEN
É utilizada para realizar avaliações de condições específicas e, associada ao THEN, retornar valores diferentes.
Vamos olhar um exemplo de uso da instrução, onde se atribui uma categoria, dado um valor ou uma faixa de valores:
SELECT
CASE WHEN amount <=200 THEN 'pequeno'
WHEN amount <=500 THEN 'medium'
ELSE 'large' END AS category
,COUNT(consumer_id) AS consumers
FROM transactions
GROUP BY 1
- o CASE, inicia a instrução;
- o ‘WHEN amount <=200’ é a definição de uma condição específica para a coluna
amount;
- o THEN define o que precisa ser retornado caso a condição seja satisfeita;
- o ELSE define um valor a ser retornado se nenhuma das condições serem satisfeitas. Trata-se de uma cláusula opcional;
- o END finaliza a instrução.
Agora eu trago algumas aplicações do CASE WHEN que ajudam a exemplificar e mostrar o quanto esse conjunto de cláusulas são importantes para as análises diárias.
a) Classificar valores em faixas
Essa aplicação é muito importante. No exemplo abaixo, a instrução CASE WHEN está sendo utilizada para criar faixas (bins) de um histograma.
SELECT
CASE WHEN amount <1 then 'a.Menor que 1 real'
WHEN amount>=1 and amount <10 then 'b.De 1 a 10 reais'
WHEN amount>=10 and amount <50 then 'c.De 10 a 50 reais'
WHEN amount>=50 and amount <100 then 'd.De 50 a 100 reais'
WHEN amount>=100 and amount <150 then 'e.De 100 a 150 reais'
WHEN amount>150 then 'f.Acima de 750 reais' end as hist
,COUNT(customer_id) as freq
from transactions
group by 1
Para entender como criar um histograma usando SQL, esse meu artigo pode te ajudar.
b) Somar, calcular mínimos e máximos para várias condições em uma mesma consulta
Para evitar a realização de várias consultas diferentes para calcular somas devido a a várias condições de filtro.
SELECT year
,month
,SUM(CASE WHEN closed_account = 0 THEN revenue ELSE 0 end) as revenue_non_closed
,SUM(CASE WHEN closed_account = 1 THEN revenue ELSE 0 end) as revenue_closed
FROM consumer
GROUP BY year, month
Para conhecer mais sobre esse truque que utiliza o CASE WHEN para cálculo de várias medidas de agregação numa mesma consulta, leia meu artigo sobre o tema.
c) Cálculo de desconto
SELECT paid
,CASE WHEN paid >= 400 THEN paid*0.05
WHEN paid >= 800 THEN paid*0.1
ELSE 0 END AS desconto
FROM orders
;
Link para parte 2
Isso é tudo pessoal!!!
Espero muito que esse texto possa enriquecer suas análises e, de alguma forma, te ajudar 🙌😁.
Para conectar comigo no Linkedin, esse aqui é o link. Para me seguir aqui no Medium, é nesse aqui.