Voltar para a lista de artigos Artigos
17 minutos de leitura

20 problemas práticos de SQL para usuários iniciantes e intermediários

Quer se tornar um especialista em SQL? Tente resolver esses 20 problemas práticos de SQL!

Quer esteja apenas começando sua jornada em SQL ou se preparando para exames, você precisa aprimorar suas habilidades em SQL se quiser se tornar um especialista. E você sabe o que as pessoas dizem: a prática leva à perfeição!

Como a maioria das habilidades, a melhor forma de aprender SQL é por meio da experiência; praticar SQL permite que você aplique seu conhecimento a cenários do mundo real. Com a prática repetida, você ganhará confiança para se aprofundar em tarefas complexas de SQL e se destacar nos campos acadêmico e profissional.

Neste artigo, selecionei 20 problemas práticos de SQL de cursos de nível iniciante e intermediário. LearnSQL.com.br nível iniciante e intermediário. Esses exercícios abrangem desde conceitos fundamentais até os mais avançados, proporcionando uma progressão gradual para que você se torne um usuário proficiente de SQL. Cada exercício inclui explicações claras e uma solução.

Muitos exercícios deste artigo são inspirados em nossa popular trilha Trilha de Práticas em SQL popular. Seus 9 cursos e mais de 1.100 exercícios de codificação o desafiarão seriamente! Se você quiser mais "exercícios" de SQL depois de terminar este artigo, recomendo que vá até lá.

Você está pronto? Vamos começar! Tente resolver cada problema antes de ler a solução.

20 Trilha de Práticas em SQL Problemas com soluções

Antes de começar, talvez você queira fazer o download ou colocar nos favoritos nossa Folha de consulta gratuita SQL para Iniciantes. Ela resume os conceitos básicos de SQL e provavelmente será útil.

Para os problemas práticos a seguir, usarei um cenário que todos nós conhecemos: uma loja. Aqui está o diagrama do banco de dados:

20 Trilha de Práticas em Problemas de SQL para Usuários Iniciantes e Intermediários

Como você pode ver, o banco de dados store banco de dados tem 6 tabelas:

A tabela de clientes contém informações sobre os clientes. Ela tem as seguintes colunas:

  • customer_id: O ID interno exclusivo do cliente.
  • contact_name: Nome completo do cliente.
  • company_name: O nome da empresa do cliente.
  • contact_email: Endereço de e-mail do cliente.
  • address: Endereço da rua do cliente.
  • city: A cidade onde o cliente mora.
  • country: O país onde o cliente mora.

A tabela product contém uma lista de produtos disponíveis na loja. Suas colunas são:

  • product_id: O ID do produto.
  • product_name: O nome do produto.
  • category_id: O ID da categoria do produto. Isso se conecta com category
  • quantity_per_unit: A quantidade de itens do produto em uma unidade.
  • unit_price: O preço do produto.
  • units_in_stock: O número de unidades disponíveis do produto.
  • discontinued: Se o produto está disponível na loja (um valor FALSO) ou se foi descontinuado (VERDADEIRO).

A tabela category tabela contém informações sobre as categorias dos produtos:

  • category_id: O ID da categoria.
  • name: O nome da categoria.
  • description: Uma descrição da categoria.
  • parent_category_id: Se essa categoria for uma subcategoria, isso aponta para a categoria principal. Caso contrário, essa coluna será NULL.

A tabela purchase contém informações sobre cada pedido:

  • purchase_id: O ID dessa compra.
  • customer_id: O ID do cliente que fez a compra.
  • employee_id: A ID do funcionário que cuidou do pedido.
  • total_price: O preço total do pedido.
  • purchase_date: O registro de data e hora em que o pedido foi recebido.
  • shipped_date: O registro de data e hora em que o pedido foi enviado.
  • ship_address: O endereço para o qual o pedido foi enviado.
  • ship_city: A cidade para a qual o pedido foi enviado.
  • ship_country: O país para o qual o pedido foi enviado.

A tabela purchase_item conecta as compras aos produtos. Ela tem as seguintes colunas obrigatórias:

  • purchase_id: O ID da compra.
  • product_id: O ID do produto comprado.
  • unit_price: O preço de uma unidade desse produto.
  • quantity: O número de unidades compradas desse produto.

A tabela employee armazena informações sobre os funcionários da loja. Ela tem as seguintes colunas:

  • employee_id: A ID do funcionário.
  • last_name: Sobrenome do funcionário.
  • first_name: Primeiro nome do funcionário.
  • birth_date: Data de nascimento do funcionário.
  • address: Endereço do funcionário.
  • city: Cidade do funcionário.
  • country: País do funcionário.
  • reports_to: O ID do supervisor direto do funcionário. É NULL se o funcionário não se reportar a ninguém.

Exercício 1: Selecionar todas as colunas

Exercício

Exiba todos os dados na tabela product tabela.

Solução

SELECT *
FROM product;

Explicação

Nessa consulta, a cláusula SELECT é usada para especificar as colunas que queremos recuperar da tabela product. Nesse caso, o asterisco (*) é uma abreviação de "todas as colunas". A cláusula FROM especifica a tabela da qual os dados devem ser recuperados. Nessa consulta, é a tabela product table.

Em resumo, a consulta está basicamente solicitando ao banco de dados que retorne todas as colunas de cada linha da tabela de produtos.

Exercício 2: Selecionar várias colunas

Exercício

Exiba os nomes e os endereços de e-mail dos clientes. Você encontrará o nome na coluna contact_name e o e-mail na coluna contact_email. Renomeie as colunas para name e email.

Solução

SELECT
  contact_name AS name,
  contact_email AS email
FROM customer;

Explicação

Nessa consulta, a cláusula SELECT é usada para especificar as colunas que queremos recuperar da tabela customer. Observe que as colunas são separadas por vírgulas.

Em seguida, usamos a palavra-chave AS para renomear a coluna contact_name para name e contact_email para email. Esses novos nomes são chamados de "aliases".

Como anteriormente, a cláusula FROM é usada para indicar a tabela da qual os dados serão recuperados; aqui, customer.

Juntando tudo isso, a consulta solicita que o banco de dados recupere as colunas contact_name e contact_email da tabela customer da tabela. Também pede que ele exiba essas colunas como name e email, respectivamente. O conjunto de resultados consistirá nessas duas colunas com alias para cada linha da tabela customer tabela.

Exercício 3: Selecionar valores distintos em uma tabela

Exercício

Exiba os IDs de todos os clientes que fizeram pelo menos uma compra. Não devem ser exibidos IDs de clientes duplicados.

Solução

SELECT DISTINCT customer_id
FROM purchase;

Explicação

Como queremos recuperar os clientes que fizeram uma compra, selecionamos seus IDs na tabela que armazena os dados de compra, purchase. A cláusula SELECT combinada com DISTINCT remove todos os valores duplicados de customer_id do conjunto de resultados.

Exercício 4: Selecionar colunas usando WHERE

Exercício

Exibir todos os dados de um cliente com ID 4.

Solução

SELECT *
FROM customer
WHERE customer_id = 4;

Explicação

Essa consulta recupera todas as colunas (* representa todas as colunas) da tabela customer mas somente quando o valor da coluna customer_id for igual a 4.

A cláusula WHERE filtra as linhas para incluir somente aquelas que correspondem à condição declarada - neste caso, que o valor na coluna customer_id é igual a 4. O operador = é usado para comparação de igualdade. O conjunto de resultados incluirá todas as colunas das linhas que atendem a essa condição.

Exercício 5: Selecionar colunas usando WHERE com texto

Exercício

Exibir os nomes de todos os clientes que moram em Dallas.

Solução

SELECT contact_name
FROM customer
WHERE city = 'Dallas';

Explicação

Essa consulta recupera todas as colunas (*) da tabela customer tabela. A cláusula WHERE filtra as linhas para incluir somente aquelas em que o valor da coluna city é igual a "Dallas". "Dallas" é um valor de cadeia de caracteres, portanto está entre aspas simples.

Exercício 6: Selecionar colunas usando WHERE e LIKE

Exercício

Exibir todos os dados de produtos cujos nomes começam com "Beef".

Solução

SELECT *
FROM product
WHERE product_name LIKE 'Beef%';

Explicação

A condição WHERE filtra as linhas para incluir somente aquelas em que o valor na coluna product_name começa com "Beef". O operador LIKE é usado para correspondência de padrão: "Beef%" é um padrão em que "Beef" é o início do padrão e "%" é um curinga que corresponde a qualquer sequência de caracteres após "Beef".

Observe que o operador LIKE diferencia maiúsculas de minúsculas; os valores que começam com "beef" ou "BEEF" não serão incluídos nos resultados.

Exercício 7: Selecionar colunas usando WHERE e <>

Exercício

Exiba os nomes dos produtos e os IDs das categorias relacionadas para categorias com qualquer ID diferente de 1 (Food).

Solução

SELECT 
  product_name, 
  category_id
FROM product
WHERE category_id <> 1;

Explicação

Essa consulta recupera colunas específicas (product_name e category_id) da tabela product onde o valor na coluna category_id é diferente de 1. O operador <> é o oposto do operador =; ele retorna somente os valores que não correspondem à condição.

Exercício 8: Selecionar colunas usando WHERE e um operador lógico

Exercício

Exiba os nomes de todos os clientes cujo nome da empresa seja Oloo ou Fliptune.

Solução

SELECT
  contact_name
FROM customer
WHERE company_name = 'Oloo'
  OR company_name = 'Fliptune';

Explicação

Essa consulta recupera os nomes dos clientes da tabela customer onde o valor na coluna company_name é igual a "Oloo" ou "Fliptune". O operador OR é usado para combinar essas condições, indicando que uma delas deve ser verdadeira para que uma linha seja incluída no conjunto de resultados.

Exercício 9: Selecionar colunas usando WHERE, OR e AND

Exercício

Exiba os dados de todos os produtos da categoria com o ID 1 (Alimentos) ou 5 (Frutas e legumes) e com um 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

Essa consulta recupera todas as colunas da tabela product onde o valor na coluna category_id é igual a 1 ou 5 e o valor na coluna unit_price é maior que 3,5. Os operadores lógicos OR e AND são usados para combinar essas condições. Observe que as condições OR estão entre parênteses para informar ao SQL que esse bloco deve ser executado primeiro.

Exercício 10: Selecionar colunas usando WHERE e NOT

Exercício

Exibir o nome de todos os produtos, exceto os produtos não descontinuados pertencentes à categoria ID 3.

Solução

SELECT product_name
FROM product
WHERE NOT (discontinued IS TRUE AND category_id = 3);

Explicação

Essa consulta recupera todas as colunas da tabela productexceto aquelas em que o valor da coluna category_id é igual a 3 e o valor lógico da coluna discontinued é TRUE. A palavra-chave NOT nega a condição entre parênteses, o que significa que ela seleciona as linhas em que discontinued e category_id são diferentes de TRUE e 3.

Exercício 11: Ordenar os resultados da consulta com ORDER BY

Exercício

Exiba todos os dados das compras ordenadas por data de envio. As compras com datas de remessa mais recentes devem ser exibidas primeiro.

Solução

SELECT 
  purchase_id, 
  total_price, 
  shipped_date
FROM purchase
ORDER BY shipped_date DESC;

Explicação

Essa consulta recupera as colunas purchase_id, total_price e purchase_date da tabela purchase e ordena o conjunto de resultados com base na coluna shipped_date em ordem decrescente. A cláusula ORDER BY ordena o conjunto de resultados com base nos valores da coluna shipped_date. A palavra-chave DESC significa "descending" (descendente), o que significa que o conjunto de resultados será classificado em ordem descendente (das datas mais recentes para as mais antigas).

Exercício 12: Selecionar e filtrar colunas e ordenar resultados

Exercício

Exibir todos os dados de compras com preço total maior ou igual a 10. As compras com as datas de envio mais recentes devem ser exibidas primeiro.

Solução

SELECT *
FROM purchase
WHERE total_price >= 10
ORDER BY shipped_date DESC;

Explicação

Essa consulta recupera todas as colunas da tabela purchase em que o valor da coluna total_price é maior ou igual a 10. Ela também ordena o conjunto de resultados com base na coluna shipped_date em ordem decrescente (DESC). A condição WHERE filtra as linhas para incluir somente aquelas em que o valor da coluna total_price é maior ou igual a 10.

Exercício 13: Colunas de grupo e COUNT()

Exercício

Exibir todos os IDs de categoria e o número de produtos nessa categoria.

Solução

SELECT category_id, COUNT(*)
FROM product
GROUP BY category_id;

Explicação

Essa consulta recupera a contagem de produtos em cada categoria na tabela product tabela. A cláusula SELECT especifica que queremos recuperar a coluna category_id e a contagem de ocorrências de cada category_id distinto (a função de agregação COUNT(*)).

Por fim, a cláusula GROUP BY agrupa os resultados com base nos valores da coluna category_id. Ela garante que a contagem seja calculada para cada category_id exclusivo.

Exercício 14: Agrupar colunas e encontrar a média

Exercício

Para todos os clientes, exiba o ID do cliente e o preço médio de todas as compras desse cliente.

Solução

SELECT 
  customer_id, 
  AVG(total_price)
FROM purchase
GROUP BY customer_id;

Explicação

Essa consulta é semelhante ao exercício anterior, mas, desta vez, usamos a função de agregação AVG() para exibir a média das compras de cada cliente. A cláusula SELECT retorna a coluna customer_id e a média de total_price para cada customer_id distinto na tabela. purchase tabela.

Exercício 15: GROUP BY Multiple Columns (Agrupar por várias colunas)

Exercício

Para cada par cliente-funcionário, encontre o preço total das compras feitas por esse cliente e processadas por esse funcionário. Exiba três colunas: customer_id, employee_id, e o total_price of purchases (preço total das compras). Nomeie a terceira coluna como total_purchases_price.

Solução

SELECT
  customer_id,
  employee_id,
  SUM(total_price) AS total_purchases_price
FROM purchase
GROUP BY
  customer_id,
  employee_id;

Explicação

Essa consulta recupera os preços totais das compras para cada par cliente-empregado. A cláusula SELECT inclui aqui a coluna customer_id, a coluna employee_id e a soma de total_price para cada customer_id na tabela. purchase tabela. A cláusula GROUP BY agrupa os resultados com base nos valores das colunas customer_id e employee_id.

Exercício 16: GROUP BY e HAVING

Exercício

Encontre o menor valor de compra para cada par cliente-empregado. Mostre somente os pares para os quais há pelo menos duas compras. Os nomes das colunas devem ser customer_id, employee_id e minimum_price.

Solução

SELECT
  customer_id,
  employee_id,
  MIN(total_price) AS minimum_price
FROM purchase
GROUP BY customer_id,
  employee_id
HAVING COUNT(total_price) >= 2;

Explicação

Essa consulta recupera os valores distintos nas colunas customer_id e employee_id junto com o preço mínimo de compra localizado na coluna total_price. O preço mínimo de compra é denominado minimum_price. A cláusula GROUP BY agrupa os resultados com base nos valores das colunas customer_id e employee_id, e a cláusula HAVING filtra os resultados para incluir somente os grupos em que a contagem de ocorrências é maior ou igual a 2.

Gostou destes exercícios do GROUP BY? Ignacio L. Bisso tem mais para você em seu excelente artigo Trilha de Práticas em SQL: 10 exercícios de GROUP BY com soluções.

Exercício 17: Selecionar colunas de 2 tabelas com INNER JOIN

Exercício

Mostre o sobrenome e o nome dos funcionários que cuidam de cada compra e o endereço shipped_date dessa compra.

Solução

SELECT
  last_name,
  first_name,
  shipped_date
FROM employee
JOIN purchase
  ON employee.employee_id = purchase.employee_id;

Explicação

Essa consulta executa uma operação INNER JOIN entre as tabelas employee e purchase e seleciona colunas específicas (last_name, first_name e shipped_date) das tabelas unidas. Ela combina as linhas da tabela employee com as linhas correspondentes da tabela purchase com base na coluna comum employee_id. Se não houver correspondência na tabela purchase tabela, a linha não será incluída no conjunto de resultados.

Exercício 18: Selecionar colunas de 4 tabelas com LEFT JOIN

Exercício

Exiba os nomes e os e-mails de todos os clientes e liste os nomes dos produtos que eles compraram e o preço do produto no momento da compra. Inclua os clientes que não fizeram nenhuma compra. Não renomeie as colunas.

Solução

SELECT
  contact_name,
  contact_email,
  product_name,
  purchase_item.unit_price
FROM customer
LEFT JOIN purchase
  ON customer.customer_id = purchase.customer_id
LEFT JOIN purchase_item
  ON purchase.purchase_id = purchase_item.purchase_id
LEFT JOIN product
  ON purchase_item.product_id = product.product_id;

Explicação

Essa consulta executa uma operação LEFT JOIN tripla entre o customer, purchase, purchase_item, e product e seleciona colunas específicas (contact_name, contact_email, product_name, e unit_price) do conjunto de resultados. Ela combina as linhas da tabela customer com as linhas correspondentes da tabela purchase, purchase_item, e product com base nas colunas comuns customer_id, purchase_id, e product_id.

Se não houver correspondência na tabela purchase os valores de NULL serão incluídos no conjunto de resultados para as colunas da tabela purchase_item tabela.

Exercício 19: Combinação de INNER JOIN, GROUP BY e HAVING

Exercício

Para cada categoria, encontre o número de produtos descontinuados. Mostre somente as categorias com pelo menos três produtos descontinuados. Classifique as linhas pelo número de produtos descontinuados em ordem decrescente. Exiba duas colunas: nome (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

Essa consulta executa uma operação INNER JOIN entre os campos product e category tabelas. Ela exibe o endereço category name e a contagem de ocorrências de cada product_id distinto no conjunto de resultados. Ela combina as linhas da tabela product com as linhas correspondentes da tabela category tabela com base na coluna comum category_id.

As linhas são agrupadas por nomes de categoria; a função de agregação COUNT() é usada na coluna category_id para retornar o número de produtos nessa categoria. A cláusula HAVING filtra as categorias com pelo menos produtos descontinuados. As linhas são exibidas em ordem decrescente de ID do produto (ORDER BY COUNT(product_id) DESC).

Exercício 20: Outra consulta INNER JOIN, GROUP BY e HAVING

Exercício

Para cada cliente, mostre o número de compras que ele fez. Inclua somente as compras com um ship_city não nulo e mostre somente os clientes cujo custo total de todas as compras tenha sido superior a 14. Os nomes das colunas devem ser contact_name e purchase_quantity. Classifique as linhas por contact_name.

Solução

SELECT
  contact_name,
  COUNT(*) AS purchase_quantity
FROM purchase
JOIN customer
  ON purchase.customer_id = customer.customer_id
WHERE ship_city IS NOT NULL
GROUP BY contact_name
HAVING SUM(total_price) > 14
ORDER BY contact_name;

Explicação

Essa consulta executa uma operação INNER JOIN entre as colunas purchase e customer e seleciona o endereço contact_name e a contagem de ocorrências de cada compra distinta do conjunto de resultados. As linhas são agrupadas por nomes de contato. A cláusula HAVING permite filtrar o preço total necessário.

Esses exercícios de JOIN foram desafiadores para você? Recomendo fortemente que você leia Junções de SQL: 12 perguntas práticas com respostas detalhadas, de Tihomir Babic.

Mais problemas de Trilha de Práticas em SQL em LearnSQL.com

Se você gostou dos problemas práticos anteriores, poderá encontrar mais problemas práticos de SQL em LearnSQL.com.br. Cada problema prático foi cuidadosamente projetado com dicas, soluções e explicações. Essa abordagem garante que os iniciantes não apenas resolvam o problema, mas também aprendam os conceitos fundamentais do SQL. Diferentemente dos exercícios teóricos convencionais, os problemas práticos do site LearnSQL.com.br são práticos e conectados a cenários da vida real. Esses problemas realistas reforçam a compreensão teórica e aumentam significativamente sua confiança.

Aqui estão alguns cursos do LearnSQL.com.br que eu particularmente recomendo se você estiver procurando mais prática:

Prática de SQL: Universidade

O curso Prática de SQL: Universidade é ideal para estudantes e iniciantes em SQL. Baseado em um cenário da vida real (uma universidade fictícia), esse curso oferece 156 exercícios interativos de SQL. Os exercícios iniciais concentram-se na construção de consultas SELECT básicas, enquanto os exercícios posteriores desafiam você a criar consultas SQL avançadas. Você usará SELECT, WHERE, vários JOINs, GROUP BY, HAVING, ORDER BY, operadores de conjunto e subconsultas.

Basic SQL Practice: A Store

O curso Basic SQL Practice: A Store é uma excelente opção para pessoas que gerenciam uma loja física ou uma loja on-line e que desejam aprimorar suas habilidades de domínio de dados. Ao fazer esse curso, você não apenas aprimorará sua compreensão dos dados, mas também poderá aumentar seus lucros. Se você estiver operando um aplicativo de marca branca adaptado para proprietários de lojas (como um ERP), este curso foi criado para você. Ele abrange uma ampla gama de tópicos, incluindo produtos, categorias, estoque, compras, gerenciamento de funcionários e muito mais.

Exercícios SQL Básico: Treine como um atleta

O curso Exercícios SQL Básico: Treine como um atleta curso envolve trabalho prático com dados autênticos. Mergulhe em um banco de dados repleto de informações das Olimpíadas do Rio, do Campeonato Mundial da IAAF de 2019 em Doha e do Campeonato Mundial da IAAF de 2017 em Londres. Descubra os campeões de corridas de velocidade, maratonas e longas distâncias, determine os países com melhor desempenho, encontre velocidades e distâncias médias e muito mais. Se você tem paixão por esportes, atletismo ou insights relacionados a pistas, este curso oferece uma experiência personalizada só para você!

Basic SQL Practice: Blog & Traffic Data

O curso Basic SQL Practice: Blog & Traffic Data foi criado para pessoas que supervisionam um blog de alto tráfego. Sua proficiência em SQL será testada à medida que você analisar vários aspectos dos dados do blog, inclusive a popularidade dos artigos, a avaliação do desempenho do autor e o sucesso das promoções de produtos baseadas em artigos. Não importa se você é proprietário de um blog, gerente ou estudante de SQL, este curso foi feito sob medida para atender às suas necessidades.

Os problemas práticos com cenários do mundo real são os melhores. Jakub Romanowski resumiu os principais locais para encontrar conjuntos de dados em seu artigo Where Can I Find Free Online Data Sets to Practice SQL?

Trilha de Práticas em SQL Problemas: O caminho a seguir

Espero que este artigo tenha ajudado você a praticar SQL! Cada desafio que você enfrenta é um passo à frente em direção ao domínio do SQL. Não importa se você é um estudante que está começando ou um especialista que deseja refinar suas habilidades, cada problema prático é um componente básico da sua base de aprendizado. Abrace a jornada, aproveite o processo e lembre-se de que cada problema prático de SQL o deixa um passo mais próximo de se tornar um especialista. Continue codificando, continue crescendo e continue SQL-ing em seu caminho para o sucesso!

Uma última dica: todos os meses, publicamos um novo curso prático de SQL em nossa trilha Monthly SQL Challenges. Isso permitirá que você aprenda resolvendo problemas de SQL de forma contínua e progressiva.

Obrigado por ler este artigo; vejo você no próximo!