15th Mar 2024 17 minutos de leitura 20 problemas práticos de SQL para usuários iniciantes e intermediários Alexandre Bruffa práticas sql aprender sql Índice 20 Trilha de Práticas em SQL Problemas com soluções Exercício 1: Selecionar todas as colunas Exercício 2: Selecionar várias colunas Exercício 3: Selecionar valores distintos em uma tabela Exercício 4: Selecionar colunas usando WHERE Exercício 5: Selecionar colunas usando WHERE com texto Exercício 6: Selecionar colunas usando WHERE e LIKE Exercício 7: Selecionar colunas usando WHERE e <> Exercício 8: Selecionar colunas usando WHERE e um operador lógico Exercício 9: Selecionar colunas usando WHERE, OR e AND Exercício 10: Selecionar colunas usando WHERE e NOT Exercício 11: Ordenar os resultados da consulta com ORDER BY Exercício 12: Selecionar e filtrar colunas e ordenar resultados Exercício 13: Colunas de grupo e COUNT() Exercício 14: Agrupar colunas e encontrar a média Exercício 15: GROUP BY Multiple Columns (Agrupar por várias colunas) Exercício 16: GROUP BY e HAVING Exercício 17: Selecionar colunas de 2 tabelas com INNER JOIN Exercício 18: Selecionar colunas de 4 tabelas com LEFT JOIN Exercício 19: Combinação de INNER JOIN, GROUP BY e HAVING Exercício 20: Outra consulta INNER JOIN, GROUP BY e HAVING Mais problemas de Trilha de Práticas em SQL em LearnSQL.com Prática de SQL: Universidade Basic SQL Practice: A Store Exercícios SQL Básico: Treine como um atleta Basic SQL Practice: Blog & Traffic Data Trilha de Práticas em SQL Problemas: O caminho a seguir 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: 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! Tags: práticas sql aprender sql