Voltar para a lista de artigos Artigos
17 minutos de leitura

15 exercícios práticos do SQL Server com soluções

Aprimore sua proficiência em SQL Server com nossos exercícios práticos de SQL Server. Cada uma dessas 15 tarefas práticas de T-SQL inclui uma solução detalhada para ajudá-lo a aprimorar suas habilidades de consulta.

Você sabe como todo mundo diz: "A prática leva à perfeição"? Bem, isso não poderia ser mais verdadeiro no caso do SQL. O verdadeiro aprendizado acontece quando você começa a trabalhar com consultas, tabelas e dados. Se quiser aprimorar suas habilidades no MS SQL Server, você está no lugar certo. Estes 15 exercícios de T-SQL para iniciantes são perfeitos para aprender o básico. (Se você estiver se perguntando, T-SQL é o dialeto SQL usado nos bancos de dados do SQL Server).

Os exercícios foram extraídos de nosso curso interativo Curso de Práticas em SQL no MS SQL Server. Esse é um curso prático de T-SQL para iniciantes que trabalham com o SQL Server. Ele oferece mais de 80 exercícios práticos, agrupados em seções sobre consultas de tabela única, funções agregadas, agrupamento e ordenação de resultados, JOINS e subconsultas, entre outros. Se você gostou dos exercícios deste artigo, recomendo que experimente o curso!

Se você for um iniciante que deseja aprender tudo o que o T-SQL tem a oferecer, confira nossa trilha de aprendizado completa SQL de A a Z no MS SQL Server. A trilha contém 7 cursos interativos de T-SQL que ensinarão a você o T-SQL moderno completo para análise de dados.

Seção 1: Gatos - exercícios de SQL perfeitos para afiar suas garras

Na primeira seção, trabalharemos na tabela Cat. Essa tabela tem as seguintes colunas:

  • Id - O ID de um determinado gato.
  • Name - O nome do gato.
  • Breed - A raça do gato (por exemplo, Siamês, Cornish Rex).
  • Coloration - A coloração do gato (por exemplo, tortoiseshell, preto).
  • Age - A idade do gato.
  • Sex - O sexo do gato.
  • FavToy - O brinquedo favorito do gato.

Exercício 1: Conheça a tabela do gato

Exercício: Selecione todos os dados da tabela Cat da tabela.

Solução:

SELECT * 
FROM Cat;

Solução: Usamos a instrução SELECT para selecionar dados do banco de dados. O asterisco (*) após SELECT significa que você deseja todas as colunas da tabela. O comando FROM Cat indica a tabela da qual você extrai as linhas.

Exercício 2: Gatinhos

Exercício: Selecione os endereços Name, Breed e Coloration para cada gato com menos de cinco anos de idade.

Solução:

SELECT 
  Name, 
  Breed, 
  Coloration 
FROM Cat 
WHERE Age < 5;

Explicação: Como antes, usamos a instrução SELECT. Desta vez, listamos as colunas que queremos selecionar: Name, Breed e Coloration. Na cláusula FROM, fornecemos o nome da tabela (Cats).

Na cláusula WHERE, especificamos a condição para selecionar somente gatos com menos de 5 anos de idade: Age < 5. Usamos o operador < para comparar o valor da coluna Age com o número 5. O banco de dados selecionará apenas os gatos com menos de 5 anos (ou seja, com idade inferior a 5).

Exercício 3: Gatos Ragdoll jovens e velhos

Exercício: Selecione o ID e o nome de cada gato com menos de cinco anos ou mais de dez anos de idade e que seja da raça Ragdoll.

Solução:

SELECT Id, Name 
FROM Cat
WHERE (Age < 5 OR Age > 10)
AND Breed = 'Ragdoll';

Explicação: Essa consulta é semelhante à anterior. A única diferença está na cláusula WHERE.

Estamos procurando gatos com menos de 5 anos ou mais de 10 anos. Para isso, usamos a condição (Age < 5 OR Age > 10). Usamos os operadores de comparação < e >, e os combinamos com o operador lógico OR. Isso seleciona os gatos que têm menos de 5 anos ou mais de 10 anos.

Em seguida, usamos a condição Breed = 'Ragdoll' para selecionar somente gatos Ragdoll. É importante observar que o valor de texto Ragdoll é colocado entre aspas simples: 'Ragdoll'.

Por fim, usamos o operador AND para combinar as condições de idade e raça.

Exercício 4: Quais gatos gostam de brincar com bolas?

Exercício: Selecione todos os dados de gatos cuja:

  • A raça começa com um "R".
  • A coloração termina com um "m".
  • O brinquedo favorito começa com a palavra "ball" (bola).

Solução:

SELECT *
FROM Cat
WHERE Breed LIKE 'R%'
  AND Coloration LIKE '%m'
  AND FavToy LIKE 'ball%'

Explicação: Usamos uma consulta simples em SELECT para resolver o exercício. Em SELECT, colocamos o asterisco * para selecionar todas as colunas da tabela.

Em seguida, usamos AND para combinar três condições de WHERE. A primeira condição seleciona gatos com nomes de raças que começam com R. Usamos o operador LIKE e o curinga %: Breed LIKE 'R%'. Essa condição significa que estamos procurando raças que comecem com R, seguidas de qualquer texto (vazio ou não).

Na segunda condição, usamos Coloration LIKE '%m' para encontrar gatos cuja coloração termine em "m". Na terceira condição, usamos FavToy LIKE 'ball%' para procurar brinquedos favoritos que comecem com "ball" (bola).

Se estiver procurando outros exercícios básicos de SQL, confira nosso artigo 10 exercícios para iniciantes em Trilha de Práticas em SQL com soluções.

Seção 2: Jogos - Aumente o nível de suas habilidades em SQL com dados de videogames

Agora vamos deixar de lado os gatos e nos concentrar em algo completamente diferente: videogames. Trabalharemos com a tabela Games que consiste em 9 colunas:

  • Id - O ID de um determinado jogo.
  • Title - O título do jogo (por exemplo, Mario Kart).
  • Company - A empresa que produziu o jogo.
  • Type - O gênero (por exemplo, corrida).
  • ProductionYear - O ano em que o jogo foi criado.
  • System - O sistema para o qual o jogo foi lançado (por exemplo, Nintendo).
  • ProductionCost - O custo de produção do jogo.
  • Revenue - A receita gerada por esse jogo.
  • Rating - A classificação do jogo (pelos usuários).

Nesta seção, vamos nos concentrar no uso das funções GROUP BY e de agregação.

Exercício 5: Custos médios de produção de bons jogos

Exercício: Mostre o custo médio de produção dos jogos que foram produzidos entre 2010 e 2015 e tiveram classificação superior a 7.

Solução:

SELECT 
  AVG(ProductionCost)
FROM Games
WHERE ProductionYear BETWEEN 2010 AND 2015
  AND Rating > 7;

Explicação: Na instrução SELECT, usamos a função agregada AVG() para calcular o custo médio de produção. Fornecemos ProductionCost como argumento; a expressão completa é AVG(ProductionCost).

Na cláusula WHERE, filtramos os jogos de alta classificação (Rating > 7) e produzidos entre 2010 e 2015 (ProductionYear BETWEEN 2010 AND 2015).

Exercício 6: Estatísticas de produção de jogos por ano

Exercício: Para todos os jogos, exiba quantos jogos foram lançados por ano (como a contagem column), o custo médio de produção (como a coluna AvgCost ) e a receita média (como a coluna AvgRevenue ).

Solução:

SELECT
  ProductionYear,
  COUNT(*) AS count,
  AVG(ProductionCost) AS AvgCost,
  AVG(Revenue) AS AvgRevenue
FROM Games
GROUP BY ProductionYear;

Explicação: Você já está acostumado com a sintaxe básica do SELECT, portanto, não vamos repassá-la. Nessa consulta, estamos usando GROUP BY para organizar as linhas em grupos com base em um determinado valor. Quando fazemos isso, podemos encontrar estatísticas para cada grupo.

No SELECT, listamos o ProductionYear e as seguintes expressões:

  • COUNT(*) para contar as linhas em cada grupo.
  • AVG(ProductionCost) para computar o custo médio de produção em cada grupo.
  • AVG(Revenue) para calcular a receita média de cada grupo.

Após FROM, adicionamos GROUP BY. Como queremos calcular as estatísticas para cada ano de produção, usamos GROUP BY ProductionYear.

Exercício 7: Estatísticas de produção da empresa

Exercício: Para cada empresa, selecione seu nome, o número de jogos que produziu (como a coluna NumberOfGames ), o custo médio de produção (como a coluna AvgCost ). Observação: Mostre apenas as empresas que produziram mais de um jogo.

Solução:

SELECT Company,
  COUNT(*) AS NumberOfGames,
  AVG(ProductionCost) AS AvgCost
FROM Games
GROUP BY Company
HAVING COUNT(Company) > 1; 

Explicação: Nessa consulta, selecionamos os dados da tabela Games tabela. Selecionamos Company, COUNT(*) para contar as linhas dessa empresa e AVG(ProductionCost) para calcular o custo médio de produção de todos os jogos produzidos por essa empresa.

Em seguida, usamos GROUP BY Company para agrupar os jogos produzidos por cada empresa. Por fim, usamos a cláusula HAVING para limitar os resultados às empresas que produziram mais de um jogo.

Exercício 8: Identificar bons jogos

Exercício: Estamos interessados em bons jogos produzidos entre 2000 e 2009. Um bom jogo é um jogo que tem uma classificação superior a 6 e foi lucrativo (ganhou mais do que seus custos de produção).

Para cada empresa, mostre o nome da empresa, sua receita total de jogos bons produzidos entre 2000 e 2009 (como a coluna RevenueSum ) e o número de jogos bons que ela produziu nesse período (como a coluna NumberOfGames ). Mostre apenas as empresas com receita de jogos de qualidade superior a 4.000.000.

Solução:

SELECT
  Company,
  COUNT(*) AS NumberOfGames,
  SUM(Revenue) AS RevenueSum
FROM Games
WHERE ProductionYear BETWEEN 2000 AND 2009
  AND Rating > 6
  AND Revenue - ProductionCost > 0
GROUP BY Company
HAVING SUM(Revenue) > 4000000;

Explicação: Em SELECT, listamos Company para obter o nome da empresa, COUNT(*) para contar o número de jogos produzidos por essa empresa e SUM(Revenue) para calcular a receita total da empresa.

Em WHERE, aplicamos os filtros em nível de linha mencionados no exercício:

  • ProductionYear BETWEEN 2000 AND 2009 para encontrar jogos produzidos entre 2000 e 2009.
  • Rating > 6 para encontrar jogos com classificação acima de 6.
  • Revenue - ProductionCost > 0 para encontrar jogos com mais receita do que custos de produção.

Agrupamos as linhas usando GROUP BY Company. Por fim, usamos o site HAVING para encontrar empresas com receita total acima de 4000000.

Exercício 9: Lucro bruto por empresa

Exercício: Para todas as empresas presentes na tabela, mostre o nome delas e a soma do lucro bruto em todos os anos. Para simplificar esse problema, suponha que o lucro bruto seja Revenue - ProductionCost; mostre essa coluna como GrossProfitSum.

Certifique-se de que os resultados comecem com a empresa que teve o maior lucro bruto.

Solução:

SELECT
  Company,
  SUM(Revenue - ProductionCost) AS GrossProfitSum
FROM Games
GROUP BY Company
ORDER BY SUM(Revenue - ProductionCost) DESC;

Explicação: Na expressão SELECT, listamos os valores Company e SUM(Revenue - ProductionCost). A expressão Revenue - ProductionCost calcula o lucro bruto de cada jogo e SUM(Revenue - ProductionCost) soma esse lucro em vários jogos.

Em seguida, agrupamos os dados por empresa (GROUP BY Company) e ordenamos os resultados pelo lucro bruto total em ordem decrescente. Por fim, ordenamos por lucro bruto; especificamos a ordem decrescente (10-1 em vez de 1-10) para que o lucro mais alto venha primeiro.

Você pode encontrar mais exercícios específicos para GROUP BY em 10 exercícios GROUP BY Trilha de Práticas em SQL com soluções

Seção 3: A arte do JOIN

Nesta seção, vamos nos concentrar em JOINs. Trabalharemos com um banco de dados com dados sobre obras de arte. Há três tabelas no banco de dados.

A tabela Artist tem as seguintes colunas:

  • Id - O ID de um determinado artista.
  • Name - O nome do artista.
  • BirthYear - O ano de nascimento do artista.
  • DeathYear - O ano em que o artista morreu.
  • ArtisticField - O campo preferido do artista (por exemplo, pintura, escultura).

A tabela PieceOfArt tem as seguintes colunas:

  • Id - O ID de uma determinada obra de arte.
  • Name - O nome da obra.
  • ArtistId - O ID do artista que criou a obra.
  • MuseumId - A ID do museu que abriga a obra.

A tabela Museum consiste nas três colunas a seguir:

  • Id - O ID de um determinado museu.
  • Name - O nome do museu.
  • Country - O país onde o museu está localizado.

Exercício 10: Listar todas as obras de arte

Exercício: Mostre os nomes de todas as obras de arte, juntamente com os nomes de seus criadores e os nomes dos museus que abrigam a arte.

Não inclua obras perdidas (ou seja, aquelas sem uma identificação de museu) e peças com um artista desconhecido. Nomeie as colunas PieceOfArtName, ArtistName e MuseumName.

Solução:

SELECT
  A.Name AS ArtistName,
  M.Name AS MuseumName,
  Poa.Name AS PieceOfArtName
FROM Museum M
JOIN PieceOfArt Poa
  ON M.Id = Poa.MuseumId
JOIN Artist A
  ON A.Id = Poa.ArtistId;

Explicação: Queremos listar todas as obras de arte sobre as quais temos informações completas (artista, museu). Isso nos diz que precisamos usar INNER JOIN para unir as tabelas.

Usamos a palavra-chave JOIN como equivalente a INNER JOIN. Primeiro, unimos as tabelas Museum e PieceOfArt no ID do museu. Em seguida, juntamos a tabela Artist com base no ID do artista.

Você pode ler sobre a união de várias tabelas em Como unir 3 tabelas (ou mais) no SQL

Exercício 11: Obras de artistas do século XIX (e posteriores)

Exercício: Encontre artistas que viveram mais de 50 anos e nasceram depois de 1800. Mostre o nome deles e o nome das obras de arte que criaram. Renomeie essas colunas para ArtistName e PieceName, respectivamente.

Solução:

SELECT
  A.Name AS ArtistName,
  Poa.Name AS PieceName
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
WHERE DeathYear - BirthYear > 50
  AND BirthYear > 1800;

Explicação: Aqui juntamos as tabelas Artist e PieceOfArt com base no ID do artista. Na cláusula WHERE, filtramos os artistas que viveram mais de 50 anos. Fazemos isso calculando a idade do artista com uma expressão DeathYear - BirthYear e filtrando-a usando a comparação DeathYear - BirthYear > 50.

Também filtramos os artistas do século XIX ou posterior com a condição BirthYear > 1800. Combinamos as duas condições com um operador AND.

Exercício 12: Produtividade dos artistas

Exercício: Mostre os nomes dos artistas juntamente com o número de anos em que viveram (nomeie a coluna YearsLived) e o número de obras que criaram (nomeie a coluna NumberOfCreated).

Mostre somente os artistas que criaram pelo menos uma obra de arte.

Solução:

SELECT
  A.Name,
  DeathYear - BirthYear AS YearsLived,
  COUNT(Poa.ArtistId) AS NumberOfCreated
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
GROUP BY A.Name, DeathYear - BirthYear;

Explicação: Essa consulta SQL seleciona o nome do artista, o número de anos que ele viveu (DeathYear - BirthYear) e o número total de obras que ele criou COUNT(Poa.ArtistId).

Os dados são unidos no ID do artista entre a tabela Artist e a tabela PieceOfArt tabela. Os resultados são agrupados pelo nome do artista e seu tempo de vida.

É importante observar dois aspectos aqui. Primeiro, temos de incluir a expressão DeathYear - BirthYear na cláusula GROUP BY, pois essa expressão não é agregada. Caso contrário, o banco de dados poderá gerar um erro. (Você pode ler sobre o erro em How to Fix a 'Not a GROUP BY Expression' Error e How to Solve the Error "must appear in the GROUP BY clause".)

Segundo, como estamos usando INNER JOIN, já temos a garantia de obter artistas que criaram pelo menos uma obra de arte. Os artistas que não tiverem obras de arte serão omitidos por este JOIN.

Você pode encontrar mais exercícios de SQL JOIN em SQL Joins: 12 Practice Questions with Detailed Answers

Seção 4: Uma carga de dados no carrinho

Nesta última seção, trabalharemos com dados de um banco de dados de loja. Ele tem cinco tabelas:

Categories Armazena os nomes das categorias de produtos:

  • Id - O ID de uma determinada categoria
  • Name - O nome da categoria.

Products armazena informações do produto:

  • Id - O ID de um determinado produto.
  • Name - O nome do produto.
  • CategoryId - O ID da categoria à qual o produto pertence.
  • Price - O preço do produto.

Clients armazena informações básicas do comprador:

  • Id - O ID de um determinado cliente.
  • FirstName - O primeiro nome do cliente.
  • LastName - O sobrenome do cliente.

Orders registra informações básicas do pedido:

  • Id - O ID de um determinado pedido.
  • ClientId - A ID do cliente que fez o pedido.
  • Year - O ano em que o pedido foi feito.

Por fim, a tabela OrderItems contém dados sobre quais itens compõem cada pedido. Essa é uma tabela associativa que conecta os dados das tabelas Orders e Products tabelas. Ela consiste nas seguintes colunas:

  • OrderId - O ID do pedido.
  • ProductId - O ID do produto no pedido acima.
  • Quantity - A quantidade do produto nesse pedido.
  • Price - O preço total do produto nesse pedido.

Exercício 13: Receita de cada pedido

Exercício: Para cada pedido, selecione seu ID (nomeie a coluna OrderId), o nome e o sobrenome do cliente que fez esse pedido e a receita total gerada por esse pedido (nomeie a coluna Revenue).

Observação: A receita do pedido é a soma da coluna Price para cada item do pedido.

Solução:

SELECT
  O.Id AS OrderId,
  C.FirstName,
  C.LastName,
  SUM(Oi.Price) AS Revenue
FROM Orders AS O
JOIN OrderItems AS Oi
  ON O.Id = Oi.OrderId
JOIN Clients AS C
  ON O.ClientId = C.Id
GROUP BY O.Id, C.FirstName, C.LastName;

Explicação: Nessa consulta, juntamos as tabelas Orders, OrderItems, e Clients.

Em SELECT, selecionamos quatro expressões: o ID do pedido, o nome e o sobrenome do cliente e a soma de todos os preços dos itens do pedido. Em GROUP BY, agrupamos os dados pelo ID do pedido e pelo nome e sobrenome do cliente. Isso nos dá a receita total de cada pedido com informações (nome e sobrenome) sobre o cliente.

Exercício 14: Quem recomprou produtos?

Exercício: Selecione o nome e o sobrenome dos clientes que recompraram produtos (ou seja, compraram o mesmo produto em mais de um pedido). Inclua os nomes desses produtos e o número dos pedidos dos quais eles fizeram parte (nomeie a coluna OrderCount).

Solução:

SELECT
  Cli.FirstName,
  Cli.LastName,
  P.Name,
  COUNT(O.Id) AS OrderCount
FROM Clients cli
JOIN Orders O
  ON Cli.Id = O.ClientId
JOIN OrderItems Oi
  ON O.Id = Oi.OrderId
JOIN Products P
  ON P.Id = Oi.ProductId
GROUP BY Cli.FirstName, Cli.LastName, P.Name
HAVING COUNT(O.Id) > 1

Explicação: Aqui juntamos quatro tabelas: Clients, Orders, OrderItems, e Products.

Em SELECT, selecionamos o nome e o sobrenome do cliente, o nome do produto e a contagem de pedidos em que esse produto foi comprado por esse cliente. Agrupamos a tabela por dados do cliente (nome e sobrenome) e pelo nome do produto. Dessa forma, as compras desse produto por esse cliente são agrupadas.

Em HAVING, filtramos as linhas em que a contagem de pedidos é maior que 1. Isso nos permite selecionar clientes que compraram o mesmo produto em mais de uma compra.

Exercício 15: Quanto cada cliente gastou por categoria?

Exercício: Selecione o nome e o sobrenome de cada cliente, o nome da categoria da qual ele comprou (em qualquer um dos pedidos) e o valor total que ele gastou nessa categoria de produto (nomeie essa coluna como TotalAmount).

Solução:

SELECT
  Cli.FirstName,
  Cli.LastName,
  C.Name,
  SUM(OI.Price) as TotalAmount
FROM Categories AS C
JOIN Products AS P
  ON C.Id = P.CategoryId
JOIN OrderItems AS OI
  ON P.Id = OI.ProductId
JOIN Orders AS O
  ON O.Id = OI.OrderId
JOIN Clients Cli
  ON Cli.Id = O.ClientId
GROUP BY Cli.FirstName, Cli.LastName, C.Name

Solução: Unimos as tabelas Categories, Products, OrderItems, Orders, e Clients. Selecionamos o nome e o sobrenome do cliente, o nome da categoria e a soma dos preços dos itens do pedido. Isso nos permite calcular quanto dinheiro cada cliente gastou em cada categoria.

Agrupamos os resultados pelo nome e sobrenome do cliente e pelo nome da categoria. Dessa forma, todos os itens de compra de cada cliente e de cada categoria são agrupados.

Prática adicional do SQL Server

Tive uma experiência e tanto explorando o mundo diversificado dos dados com o T-SQL. Desde descobrir os segredos por trás do comportamento de gatos até analisar estratégias de jogos e apreciar a arte por meio de números, o SQL tem sido minha ferramenta de confiança. Ele mudou a maneira como vejo as perguntas e descubro as histórias ocultas nos dados ao nosso redor.

Você gostaria de praticar mais o SQL Server? Dê uma olhada nesses recursos incríveis:

Se você está pronto para aprofundar suas habilidades, nosso curso Curso de Práticas em SQL in MS SQL Server é exatamente o que você precisa. Ele foi criado para fortalecer sua base e aumentar sua capacidade de analisar e interpretar dados de forma eficaz. A cada exercício, você se sentirá mais confiante e habilidoso para lidar com consultas complexas.

Prática do SQL Server

Para aqueles que desejam explorar todos os aspectos do SQL, o nosso abrangente curso SQL de A a Z in MS SQL Server abrange tudo, desde o básico até as técnicas avançadas. É o caminho de aprendizado perfeito para quem deseja dominar o SQL Server e tomar decisões informadas com base em insights de dados. Não importa se você é um iniciante ou está procurando aprimorar suas habilidades, esses recursos o ajudarão a ter sucesso no mundo dos dados.

Não espere mais - comece a dominar o SQL Server hoje mesmo e libere todo o potencial de seus dados!