19th Jun 2024 17 minutos de leitura 15 exercícios práticos do SQL Server com soluções Jorge Sandoval prática on-line sql server Índice Seção 1: Gatos - exercícios de SQL perfeitos para afiar suas garras Exercício 1: Conheça a tabela do gato Exercício 2: Gatinhos Exercício 3: Gatos Ragdoll jovens e velhos Exercício 4: Quais gatos gostam de brincar com bolas? Seção 2: Jogos - Aumente o nível de suas habilidades em SQL com dados de videogames Exercício 5: Custos médios de produção de bons jogos Exercício 6: Estatísticas de produção de jogos por ano Exercício 7: Estatísticas de produção da empresa Exercício 8: Identificar bons jogos Exercício 9: Lucro bruto por empresa Seção 3: A arte do JOIN Exercício 10: Listar todas as obras de arte Exercício 11: Obras de artistas do século XIX (e posteriores) Exercício 12: Produtividade dos artistas Seção 4: Uma carga de dados no carrinho Exercício 13: Receita de cada pedido Exercício 14: Quem recomprou produtos? Exercício 15: Quanto cada cliente gastou por categoria? Prática adicional do SQL Server 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: Aprendendo SQL? 12 maneiras de praticar SQL on-line Como criar seu próprio banco de dados para praticar SQL Folha de consulta do SQL Server 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. 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! Tags: prática on-line sql server