Voltar para a lista de artigos Artigos
13 minutos de leitura

SQL para análise de dados: 15 exercícios práticos com soluções

Você é novo no mundo do SQL e está ansioso para desvendar o poder da análise de dados? Neste artigo, aprimoraremos nossas habilidades em SQL por meio de 15 exercícios práticos e práticos desenvolvidos especificamente para iniciantes. Porque quando se trata de SQL, a prática realmente leva à perfeição!

Vamos nos concentrar no domínio crítico da análise de dados, onde o SQL ocupa o centro do palco. O SQL, ou Structured Query Language (Linguagem de Consulta Estruturada), desempenha um papel fundamental na análise de dados. Ela fornece uma estrutura robusta para consultar, transformar e extrair insights valiosos dos bancos de dados. Se estiver ansioso para se aprofundar no mundo do SQL e se tornar um mestre da análise de dados, você pode explorar informações e recursos adicionais em nosso artigo Aprenda SQL para análise de dados.

O que não vamos fazer é entediá-lo com teoria. Em vez disso, acreditamos firmemente no poder do aprendizado por meio da experiência prática. É por isso que selecionamos uma coleção de 15 exercícios de SQL para iniciantes que o mergulham na arte da análise de dados - tudo isso utilizando um conjunto de dados do mundo real de uma loja.

Esses exercícios foram extraídos de nosso curso abrangente, Basic Trilha de Práticas em SQL: A Store, que oferece um total de 169 exercícios interativos on-line. Os exercícios do artigo estão agrupados em diferentes tópicos: consultas de tabela única, consultas JOIN, consultas ORDER BY, exercícios GROUP BY e outros recursos. Se você gostar desses exercícios, sem dúvida desejará explorar o curso para ter uma experiência de aprendizado mais abrangente.

Agora, prepare-se para arregaçar as mangas e mergulhar totalmente no reino da análise de dados com base em SQL!

Visão geral do banco de dados do Store

O banco de dados da loja consiste em seis tabelas, cada uma com uma finalidade única e estruturada para funções específicas. Essas tabelas são essenciais para os exercícios de SQL em questão, e é importante obter uma compreensão abrangente de seus componentes. A seguir, veremos uma breve descrição de cada tabela.

SQL para análise de dados
  • employee: Contém detalhes do funcionário, como ID, nome, data de nascimento, endereço, cidade, país e supervisor imediato.
  • customer: Armazena informações do cliente, incluindo ID do cliente, nome, empresa, e-mail, endereço, cidade e país.
  • purchase: Registra detalhes de pedidos, incluindo ID do pedido, ID do cliente (quem fez o pedido), funcionário (quem atendeu o pedido), preço total e detalhes de compra e envio.
  • purchase_item: Conecta compras a produtos por meio de ID, produto, preço unitário e quantidade.
  • category: Fornece insights sobre categorias de produtos usando ID da categoria, nome, descrição e ID da categoria principal.
  • product: Lista os produtos da loja e inclui o ID do produto, o nome do produto, o ID da categoria, a quantidade por unidade, o preço unitário, as unidades em estoque e o status do produto.

Agora que temos uma melhor compreensão das tabelas no banco de dados da loja, vamos nos aprofundar em alguns exercícios de SQL para ajudar a aprimorar suas habilidades de análise de dados.

Exercícios de SQL para análise de dados

Como a prática é essencial para desenvolver e refinar suas habilidades em SQL, esses exercícios servirão como ferramentas valiosas. Até criamos uma folha de consulta de SQL para análise de dados para facilitar as coisas para você! Talvez você queira mantê-la à mão em sua jornada pelos 15 exercícios de SQL a seguir.

Consultas de tabela única

Nesta seção, vamos nos concentrar nas consultas SQL que envolvem uma única tabela. Esses exercícios o ajudarão a dominar a arte básica de recuperar, filtrar e trabalhar com dados em um único conjunto de dados.

Exercício 1: Todos os produtos

Exercício: Exibir todos os dados presentes na tabela product tabela.

Solução:

SELECT *
FROM product;

Explicação da solução: Essa consulta simples recupera todos os dados da tabela product tabela. O asterisco (*) é usado para indicar que queremos selecionar todas as colunas disponíveis na tabela, basicamente obtendo todos os dados. Após a palavra-chave FROM, informamos o nome da tabela da qual estamos selecionando (aqui, a tabela product).

Exercício 2: Produtos com preço unitário maior que 3,5

Exercício: Exibir os nomes dos produtos com um preço unitário maior ou igual a 3,5.

Solução:

Explicação da solução: Usando a cláusula WHERE, filtramos product_names com um preço unitário maior ou igual a 3,5. A cláusula WHERE restringe as linhas retornadas pela consulta apenas àquelas que atendem aos critérios especificados.

Exercício 3: Produtos com condições específicas para categoria e preço

Exercício: Exibir dados de todos os produtos em categorias com ID 1 (Alimentos) ou 5 (Frutas e legumes) e com preço unitário acima de 3,5.

Solução:

SELECT *
FROM product
WHERE (category_id = 1 OR category_id = 5)
  AND unit_price > 3.5;

Explicação da solução: Essa consulta usa os operadores AND e OR para criar condições complexas que filtram os produtos com base na categoria e em unit_price.

O operador OR permite produtos da categoria 1 (Food) ou da categoria 5 (Fruits and Vegetables), enquanto o operador AND garante que os produtos selecionados devem ter um preço unitário maior que 3,5. O uso de colchetes melhora a legibilidade da consulta.

Consultas JOIN

As junções são um conceito fundamental do SQL. Elas são cruciais para a análise de dados porque permitem combinar e analisar dados de diferentes fontes, possibilitando insights abrangentes sobre seus conjuntos de dados. Para obter mais exercícios práticos envolvendo junções, consulte nosso artigo SQL Joins: 12 perguntas práticas com respostas detalhadas.

Exercício 4: Produtos e categorias

Exercício: Selecione os nomes dos produtos junto com suas categorias. Exiba duas colunas: product_name e category_name.

Solução:

SELECT
  product_name,
  category.name AS category_name
FROM product
JOIN category
  ON product.category_id = category.category_id;

Explicação da solução: Neste exercício, o site INNER JOIN combina dados das colunas product e category tabelas. Um INNER JOIN seleciona somente as linhas que têm valores correspondentes em ambas as tabelas. Isso garante que somente os produtos com categorias correspondentes sejam recuperados, criando um resultado significativo e preciso.

A parte ON da consulta define a relação entre as duas tabelas. Além disso, o uso de aliases (AS category_name) nos permite renomear as colunas conforme exigido pela pergunta.

Exercício 5: Compras e produtos

Exercício: Para cada compra, exiba o ID da compra, o nome do produto, o preço unitário no momento da compra e a quantidade de itens de cada produto.

Solução:

SELECT
  purchase_id,
  product_name,
  purchase_item.unit_price,
  quantity
FROM purchase_item
JOIN product
  ON purchase_item.product_id = product.product_id;

Explicação da solução: Essa consulta combina dados do purchase_item e product o que nos permite exibir informações relevantes sobre a compra. Em SQL, INNER JOIN e JOIN são frequentemente usados de forma intercambiável, mas têm a mesma finalidade: recuperar linhas correspondentes de ambas as tabelas.

Exercício 6: Compras e categorias

Exercício: Para cada compra, exiba todas as categorias de produtos comprados nessa compra. Mostre cada categoria apenas uma vez para cada compra.

Solução:

SELECT DISTINCT
  purchase_id,
  category.name AS category_name
FROM purchase_item
JOIN product
  ON purchase_item.product_id = product.product_id
JOIN category
  ON product.category_id = category.category_id;

Explicação da solução: Neste exercício, estamos unindo três tabelas: purchase_item, product, e category. A união de mais de duas tabelas é obtida conectando-se sequencialmente cada tabela por meio de suas colunas relacionadas. Se quiser saber mais sobre como unir várias tabelas, leia Como Juntar 3 Tabelas (ou Mais) Em SQL.

O uso da palavra-chave DISTINCT aqui garante que cada categoria de produto apareça apenas uma vez para cada compra, fornecendo uma lista clara e concisa das categorias associadas a cada compra. Isso pode ser especialmente útil quando se deseja evitar informações redundantes em seu conjunto de resultados.

Consultas ORDER BY

A classificação de dados é uma etapa crucial na análise de dados, pois permite organizar as informações de forma estruturada e significativa. Os exercícios a seguir o ensinarão a organizar os dados de forma significativa para fins de relatório e análise.

Exercício 7: Categorias ordenadas

Exercício: Exiba os dados de todas as categorias. Classifique as categorias por nome em ordem crescente (A a Z).

Solução:

SELECT *
FROM category
ORDER BY name ASC;

Explicação da solução: Neste exercício, usamos a cláusula ORDER BY para classificar os resultados da tabela category em ordem crescente com base na coluna name. Essa organização permite que você visualize as categorias em ordem alfabética. A palavra-chave ASC é opcional aqui; ela representa a ordem de classificação padrão, que é ascendente.

Exercício 8: Funcionários classificados por data de nascimento

Exercício: Mostre os sobrenomes, os nomes e as datas de nascimento dos funcionários. Classifique os resultados por idade do funcionário em ordem crescente(Dica: use a colunabirth_date ).

Solução:

SELECT
  last_name,
  first_name,
  birth_date
FROM employee
ORDER BY birth_date DESC;

Explicação da solução: Como não há coluna de idade em nossa tabela, classificamos os funcionários por birth_date em ordem decrescente usando a palavra-chave DESC. A classificação por birth_date em ordem decrescente permite que você visualize os funcionários do mais novo para o mais velho.

O uso do DESC é crucial aqui, pois ele reverte a ordem de classificação ascendente padrão e atinge o resultado desejado.

Exercício 9: Produtos classificados pelo número de unidades

Exercício: Exibir dados de todos os produtos, classificando os resultados pelo número de unidades em ordem decrescente e pelo nome do produto em ordem crescente.

Solução:

SELECT *
FROM product
ORDER BY units_in_stock DESC, product_name ASC;

Explicação da solução: Essa consulta ordena os produtos primeiro por units_in_stock em ordem decrescente e depois por product_name em ordem crescente. A primeira condição de classificação garante que os produtos com o maior número de unidades em estoque apareçam na parte superior; os produtos com o mesmo número de unidades são classificados em ordem alfabética pelo nome.

Consultas GROUP BY

Nesta seção, exploramos as consultas SQL que envolvem o agrupamento de dados para análise. GROUP BY é essencial para agregar e resumir informações com base em critérios específicos. Consulte GROUP BY em SQL Explained para obter mais informações.

Exercício 10: O preço médio unitário de cada categoria

Exercício: Para cada categoria de produto, mostre seu nome e encontre o preço unitário médio. Exiba duas colunas: nome e average_unit_price.

Solução:

SELECT
  category.name,
  AVG(unit_price) AS average_unit_price
FROM product
JOIN category
  ON product.category_id = category.category_id
GROUP BY category.name;

Explicação da solução: Neste exercício, estamos calculando o preço unitário médio de cada categoria de produto. A consulta junta as colunas product e category para associar os produtos às suas respectivas categorias. A cláusula GROUP BY é então usada para agrupar os dados por category_name. Usando AVG(), podemos calcular o preço unitário médio dentro de cada categoria, o que nos dá insights sobre a distribuição de preços em diferentes categorias de produtos.

Exercício 11: O número de clientes nas cidades

Exercício: Conte quantos clientes vivem em cada cidade, exceto em Knoxville e Stockton. Classifique os resultados pelo nome da cidade em ordem crescente. Exiba duas colunas: city e customers_quantity.

Solução:

SELECT
  city,
  COUNT(customer_id) AS customers_quantity
FROM customer
WHERE city <> 'Knoxville'
  AND city <> 'Stockton'
GROUP BY city
ORDER BY city;

Explicação da solução: Nessa consulta, usamos a cláusula WHERE com o operador <> (que significa não igual a) para filtrar os registros com o nome da cidade Knoxville ou Stockton. Essa filtragem garante que a análise abranja todas as cidades, exceto as especificadas.

Em seguida, a função COUNT() calcula a contagem de clientes para cada uma das cidades restantes. A cláusula GROUP BY agrupa os dados por nome de cidade, o que nos permite contar os clientes de cada cidade.

Por fim, os resultados são ordenados em ordem crescente por cidade, fornecendo uma visão clara e organizada da distribuição de clientes em várias cidades.

Exercício 12: O número de produtos descontinuados

Exercício: Para cada categoria, encontre o número de produtos descontinuados. Mostre apenas as categorias com pelo menos três produtos descontinuados. Classifique as linhas pelo número de produtos descontinuados em ordem decrescente. Exiba duas colunas: name (o nome da categoria) e discontinued_products_number.

Solução:

SELECT
  category.name,
  COUNT(product_id) AS discontinued_products_number
FROM product
JOIN category
  ON product.category_id = category.category_id
WHERE discontinued IS TRUE
GROUP BY category.name
HAVING COUNT(product_id) >= 3
ORDER BY COUNT(product_id) DESC;

Explicação da solução: Nessa consulta, utilizamos a cláusula HAVING para filtrar categorias com pelo menos três produtos descontinuados. A cláusula HAVING é aplicada após a operação GROUP BY e nos permite filtrar os resultados agregados com base em uma condição específica. Para obter mais informações sobre o uso do HAVING, leia nossos artigos A Cláusula SQL HAVING Explicada e HAVING vs. WHERE in SQL: O que você deve saber.

Além disso, você notará o uso da função COUNT() na cláusula ORDER BY. Isso nos permite classificar as linhas com base na contagem de produtos descontinuados em ordem decrescente.

A cláusula ORDER BY é flexível e pode incluir funções agregadas, o que a torna uma ferramenta poderosa para organizar dados com base em valores agregados.

Outros recursos SQL

Nesta seção, vamos nos aprofundar em outros recursos SQL para expandir seu kit de ferramentas. Exploraremos o trabalho com valores NULL e a limpeza de dados usando a função ROUND(). Esses recursos são essenciais para lidar com cenários complexos de análise de dados.

Exercício 13: Funcionários com data de contratação desconhecida

Exercício: Exibir o sobrenome e o nome dos funcionários com data de contratação desconhecida.

Solução:

SELECT
  last_name,
  first_name
FROM employee
WHERE hire_date IS NULL;

Explicação da solução: Nessa consulta, a cláusula WHERE com hire_date IS NULL nos permite filtrar e selecionar registros em que a data de contratação está ausente. Esse tipo de consulta pode ser uma análise crucial para identificar registros incompletos de funcionários ou erros de entrada de dados no conjunto de dados.

Exercício 14: Número de funcionários com datas de nascimento e contratação desconhecidas

Exercício: Contar o número de funcionários com datas de nascimento e de contratação desconhecidas .

Solução:

SELECT
  COUNT(*) AS employees_number
FROM employee
WHERE birth_date IS NULL
  AND hire_date IS NULL;

Explicação da solução: Nessa consulta, usamos novamente a condição IS NULL para filtrar as linhas em que birth_date e hire_date estão ausentes. Isso nos permite acessar COUNT() somente para os funcionários que não têm informações sobre data de nascimento e de contratação.

Exercício 15: Porcentagem do dinheiro gasto pelo cliente na compra

Exercício: Para cada cliente que fez uma compra, exiba o ID de cada compra feita por esse cliente e a porcentagem de dinheiro gasto nessa compra em relação a todo o dinheiro gasto por esse cliente.

Solução:

SELECT
  contact_name,
  purchase_id,
  ROUND(total_price * 100.0 / (SELECT SUM(total_price) FROM purchase WHERE customer_id = p.customer_id)) AS percentage
FROM purchase p
JOIN customer 
  ON p.customer_id = customer.customer_id;

Explicação da solução: Nesta solução, usamos duas consultas. A consulta principal incorpora uma subconsulta na instrução SELECT para calcular o SUM() dos preços totais das compras feitas pelo mesmo cliente.

A porcentagem é então calculada usando a fórmula fornecida e a função ROUND() é aplicada para arredondar o resultado. Essa consulta é uma ferramenta poderosa para obter insights sobre o comportamento de compra de cada cliente.

Pronto para mais exercícios de SQL?

Dominar o SQL é uma habilidade essencial para a análise de dados - e a melhor maneira de aprender é fazendo. Neste artigo, analisamos uma seleção de 15 exercícios de SQL para iniciantes, extraídos de nosso curso abrangente, Basic Trilha de Práticas em SQL: A Store.

Mas esses exercícios são apenas o começo. Se você estiver ansioso por uma experiência de aprendizado mais extensa, convidamos você a explorar nosso curso completo que apresenta 169 exercícios interativos. Para aqueles que desejam desafios ainda maiores, este curso é apenas um dos nove cursos disponíveis no Trilha de Práticas em SQL cada um oferecendo um formato envolvente.

Também temos a trilha SQL Monthly Practice, que é atualizada regularmente com novos exercícios para manter suas habilidades afiadas e atualizadas com os últimos desenvolvimentos em SQL.

Mergulhe em mais exercícios de SQL e você dominará a arte da análise de dados. Sua jornada para se tornar um especialista em SQL começa com a prática contínua. Portanto, continue explorando e aprimorando suas habilidades. O sucesso está logo ali na esquina!