Voltar para a lista de artigos Artigos
22 minutos de leitura

18 perguntas práticas sobre SQL para iniciantes: Exercícios teóricos e práticos

Se você está começando ou atualizando suas habilidades em SQL, junte-se a nós enquanto trabalhamos com estas 18 questões práticas de SQL para iniciantes.

SQL, ou Structured Query Language (Linguagem de consulta estruturada), é uma linguagem de programação usada para definir, recuperar e manipular dados em bancos de dados relacionais. Ela fornece uma sintaxe intuitiva de instruções SQL e palavras-chave que criam, modificam e consultam bancos de dados relacionais.

Este artigo se concentra na revisão e na prática dos conceitos básicos de SQL. Começaremos analisando a instrução SELECT e seus componentes obrigatórios e opcionais para obter dados de uma única tabela. Em seguida, vamos nos aprofundar em JOINs, que nos permite mesclar dados de duas ou mais tabelas. Por fim, demonstraremos como agregar e agrupar dados para realizar análises mais avançadas. Isso pode ajudá-lo a revisar seus conhecimentos de SQL antes de uma entrevista ou de um teste, ou simplesmente atualizar e consolidar suas habilidades.

Este artigo apresenta exercícios práticos de SQL de nosso curso interativo Curso de Práticas em SQL curso interativo. O curso oferece mais de 80 exercícios práticos que abrangem diferentes tópicos de SQL: consultas de tabela única, junções, agregação e agrupamento, subconsultas e muito mais. Se quiser praticar mais por conta própria, recomendamos que você confira nossa Trilha de Práticas em SQL trilha.

Todos os nossos cursos práticos de SQL oferecem exercícios baseados em conjuntos de dados do mundo real, para que você possa praticar SQL em cenários realistas. Os cursos são agrupados em diferentes tópicos - por exemplo, consultas de tabela única, junções, agregação e agrupamento e subconsultas - para que você possa escolher o que deseja praticar.

Vamos começar.

Trilha de Práticas em SQL Para iniciantes

Os exercícios práticos de SQL deste artigo abordam os conceitos básicos de consulta de dados. Examinaremos:

  • Consultas de tabela única - Consultar dados de uma única tabela usando a instrução SELECT.
  • JOINs - Unir dados de várias tabelas usando vários JOINs.
  • Agregação e agrupamento de dados - Colocação de dados em grupos com base em colunas definidas e compilação de estatísticas.

Consultas de tabela única

Começaremos revisando os conceitos básicos de consulta de dados de uma única tabela e impondo condições personalizadas às colunas de dados.

Pergunta 1: Elementos de uma consulta SQL

Pergunta:

Liste todos os elementos de uma consulta SQL.

Resposta:

A instrução SELECT consiste nos seguintes componentes:

  • SELECT column_name(s) - Define as colunas de dados mostradas na saída.
  • FROM table_name - Define a tabela do banco de dados da qual os dados são selecionados.
  • WHERE column_name = value - Filtra os dados de saída com base nas condições declaradas (opcional).
  • GROUP BY column_name(s) - Agrupa os dados com base em valores distintos (opcional). Se estiver usando funções agregadas, você deverá usar a cláusula GROUP BY.
  • HAVING - Filtra os dados depois de terem sido processados pelo GROUP BY (opcional); você pode usar isso para impor condições às funções agregadas.
  • ORDER BY column_name [ASC | DESC] - Ordena os dados de saída por uma coluna definida em ordem ascendente ou descendente (opcional).

As cláusulas SELECT e FROM são fáceis de entender, pois SELECT lista as colunas de dados e FROM define a tabela de dados. No caso da cláusula WHERE, há uma variedade de condições que você pode impor às colunas, que analisaremos na próxima pergunta.

Você pode ler mais sobre os elementos básicos da consulta em nosso artigo Enumerar e explicar todos os elementos básicos de uma consulta SQL.

Conclusões:

Estes são os elementos de uma consulta SQL em ordem de aparecimento: SELECT, FROM, WHERE, GROUP BY, ORDER BY, e HAVING.

Pergunta 2: Filtragem de dados em uma consulta SQL

Questão:

Como você filtra dados em uma consulta SQL usando condições personalizadas?

Resposta:

Para impor condições personalizadas às colunas de dados, usamos a cláusula WHERE. Por exemplo, se você quiser selecionar pessoas com mais de 18 anos, use a cláusula WHERE da seguinte forma:

SELECT name, age
FROM person
WHERE age > 18;

As condições da cláusula WHERE normalmente envolvem comparações ou operações lógicas e dependem do tipo de dados armazenado na coluna.

  • Operadores de comparação usados para comparar valores:
    • Tipos de dados numéricos: =, <> or !=, >, <, >=, <=
    • Tipos de dados de texto/string: =, <> or !=, LIKE, IN, NOT LIKE, NOT IN
    • Tipos de dados de data e hora: =, <> or !=, >, <, >=, <=, BETWEEN, NOT BETWEEN
    • Tipos de dados booleanos: =, <> or !=
  • Operadores usados para verificar os valores NULL: IS NULL, IS NOT NULL
  • Operadores lógicos usados para combinar várias condições: AND, OR, NOT

Você pode ler mais sobre filtragem de dados em nossos artigos How to Write a WHERE Clause in SQL e Usando AND, OR, e NOT Operadores em SQL.

Conclusões:

A cláusula WHERE é usada para filtrar dados impondo condições às colunas de dados.

Dados para as perguntas 3 a 6

Nos exercícios 3 a 6, usaremos a tabela cat tabela. Ela 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, pelo curto britânico, etc.).
  • coloration - A coloração do gato (por exemplo, chita, tabby, etc.).
  • age - A idade do gato.
  • sex - O sexo do gato.
  • fav_toy - O brinquedo favorito do gato.

Pergunta 3: Selecione gatos de uma determinada idade e raça

Pergunta:

Selecione o ID e o nome de cada gato Ragdoll que seja 1) menor de cinco anos de idade ou 2) maior de dez anos de idade.

Resposta:

SELECT
  id,
  name
FROM cat
WHERE (age < 5 OR age > 10)
  AND breed = 'Ragdoll';

Explicação:

Como diz a instrução, selecionamos as colunas id e name da tabela cat da tabela.

Em seguida, usamos a cláusula WHERE para impor condições:

  • Na coluna age (idade):

Queremos selecionar gatos com menos de 5 anos (age < 5) ou mais de 10 anos (age > 10), portanto, usamos a palavra-chave OR e colocamos as duas condições entre parênteses.

Por que precisamos de parênteses? Bem, queremos impor essa condição composta na coluna de idade. E se não incluirmos parênteses? Os parênteses serão impostos implicitamente às duas últimas condições, da seguinte forma: age < 5 OR (age > 10 AND breed = 'Ragdoll'). Isso causará um resultado incorreto.

  • Na coluna breed (raça):

Queremos selecionar gatos da raça Ragdoll; portanto, basta definir a condição como breed = 'Ragdoll'. Observe que os valores de texto no SQL são colocados entre aspas simples (').

Este exercício demonstra uma condição composta que usa operadores lógicos (AND, OR) e operadores de comparação matemática (<, >, =).

Pergunta 4: Listar os gatos cujo brinquedo favorito é uma bola

Pergunta:

Selecione todos os dados de gatos cuja raça comece com "R", cujo brinquedo favorito comece com "bola" e cuja coloração termine com um "m".

Resposta:

SELECT *
FROM cat
WHERE breed LIKE 'R%'
  AND fav_toy LIKE 'ball%'
  AND coloration LIKE '%m';

Explicação:

Aqui, selecionamos todas as colunas de dados (*) da cat tabela.

Queremos impor condições aos valores literais das colunas breed, colorations e fav_toy. Para fazer isso, usaremos a correspondência de padrões; no SQL, % é um caractere curinga que representa qualquer sequência de caracteres.

O valor da coluna breed deve começar com um "R". Portanto, usamos um padrão que indica um valor que começa com 'R' e é seguido por qualquer número de caracteres (definido por %). Se quisermos impor essa condição em um valor literal, devemos usar a palavra-chave LIKE: breed LIKE 'R%'.

Da mesma forma, queremos que o nome do brinquedo favorito comece com 'ball'; portanto, a condição é fav_toy LIKE 'ball%'.

E o mesmo acontece com a coluna coloration. Queremos que o valor literal termine com um 'm', portanto, o caractere % vai na frente: coloration LIKE '%m'.

Você pode ler mais sobre o uso do operador LIKE em nossos artigos O que os Operadores LIKE e NOT LIKE fazem? e How to Use LIKE in SQL.

Pergunta 5: Encontre o gato mais entediado

Pergunta:

Selecione os nomes de todos os gatos machos que não têm um brinquedo favorito - ou seja, o valor do campo fav_toy é NULL.

Resposta:

SELECT name
FROM cat
WHERE sex = 'M'
  AND fav_toy IS NULL;

Explicação:

Como diz a instrução, selecionamos a coluna name da tabela cat tabela.

Queremos selecionar somente gatos machos; portanto, definimos uma condição na coluna sex como sex = 'M'. Você precisa estar familiarizado com os dados armazenados na tabela cat para definir essa condição, ou seja, saber que a coluna sex armazena o valor ‘F’ para gatos fêmeas e ‘M’ para gatos machos.

Como estamos procurando o gato mais entediado, precisamos definir uma condição que diga que a coluna fav_toy não deve ter valor ou deve ser NULL. Fazemos isso com fav_toy IS NULL.

Trabalhar com NULLs é bastante complicado no SQL. Para obter mais detalhes, recomendamos os artigos:

Pergunta 6: Selecionar gatos que adoram brinquedos de provocação

Pergunta:

Selecione o ID, o nome, a raça e a coloração de todos os gatos que:

  • São fêmeas.
  • Gostam de brinquedos de provocação,
  • Não são das raças persa ou siamesa.

Resposta:

SELECT 
  id,
  name,
  breed,
  coloration
FROM cat
WHERE sex = 'F'
  AND fav_toy = 'teaser'
  AND (breed NOT LIKE 'Persian' AND breed NOT LIKE 'Siamese');

Explicação:

Neste exercício, selecionamos as colunas id, name, breed e coloration da cat tabela. Em seguida, impomos as seguintes condições:

  • Na coluna sex:
    Queremos selecionar gatos fêmeas; portanto, a condição é sex = 'F'.
  • Na coluna fav_toy:
    Queremos encontrar gatos que gostem de brinquedos de provocação, portanto, a condição é fav_toy = 'teaser'.
  • Na coluna breed (raça):
    Queremos selecionar qualquer raça, exceto Persa e Siamês. Para fazer isso, usamos a palavra-chave NOT LIKE e colocamos toda a condição composta entre parênteses (breed NOT LIKE 'Persian' AND breed NOT LIKE 'Siamese').

Excelente trabalho! Você concluiu a seção sobre a seleção de dados de uma única tabela com várias condições de filtro. Vamos passar a trabalhar com várias tabelas.

Dados de várias tabelas: Cláusulas JOIN em SQL

Agora você sabe como selecionar dados de uma única tabela. Mas e se quisermos selecionar dados de duas ou mais tabelas? Precisamos unir essas tabelas com base em valores de coluna comuns. É aqui que as operações JOIN entram em ação.

Pergunta 7: A função do JOIN

Pergunta:

O que o JOIN faz no SQL?

Resposta:

A cláusula JOIN é usada para combinar dados de duas ou mais tabelas.

Você pode usar quantas JOINs forem necessárias. Abaixo, usamos duas JOINs para combinar dados de três tabelas:

SELECT t1.column, t2.column, t3.column
FROM table1 AS t1
JOIN table2 AS t2 ON t1.column = t2.column
JOIN table3 AS t3 ON t1.column = t3.column
...

Ao unir tabelas, é melhor usar nomes de alias para cada tabela (aqui, t1, t2 e t3). Esses nomes de alias são usados para fazer referência às colunas de cada tabela.

Para saber mais sobre Cláusulas JOIN em SQL, consulte nossos artigos SQL INNER JOIN Explicado em palavras simples e Como Juntar Duas Tabelas em SQL.

Conclusão:

JOINs Os JOINs são usados para combinar dados de várias tabelas.

Pergunta 8: Tipos de JOINs

Pergunta:

Liste todos os tipos de JOINs disponíveis no SQL e descreva brevemente cada um deles.

Resposta:

Há quatro tipos de JOINs: [INNER] JOIN, RIGHT JOINLEFT JOIN, e FULL [OUTER] JOIN. Cada um deles fornece resultados diferentes.

Uma JOIN, também conhecida como INNER JOIN, é o tipo mais comum de união. Ele retorna apenas os registros correspondentes de duas ou mais tabelas.

Perguntas práticas sobre sql

Um LEFT JOIN retorna todos os registros da tabela da esquerda (primeira) e os registros correspondentes da tabela da direita (segunda). Se não houver correspondências na tabela da direita, os valores null serão incluídos no conjunto de resultados.

Perguntas práticas sobre sql

Leia O que é um LEFT JOIN no SQL? para obter mais detalhes.

Um RIGHT JOIN retorna todos os registros da tabela da direita (segunda) e os registros correspondentes da tabela da esquerda (primeira). Se não houver correspondências na tabela da esquerda, os valores null serão incluídos no conjunto de resultados.

Perguntas práticas sobre sql

Um FULL JOIN, também conhecido como FULL OUTER JOIN, retorna todos os registros das tabelas da esquerda e da direita. Ele inclui registros correspondentes de ambas as tabelas e usa os valores null para registros não correspondentes.

Perguntas práticas sobre sql

Leia este artigo para saber mais sobre FULL JOINs.

Em resumo, LEFT JOIN e RIGHT JOIN concentram-se em uma tabela como fonte primária de dados, enquanto um FULL JOIN combina todos os registros de ambas as tabelas. A escolha de qual JOIN usar depende das necessidades específicas de recuperação de dados e da relação entre as tabelas envolvidas.

Para saber mais sobre os diferentes tipos de JOIN, recomendamos nossos artigos Cláusulas JOIN em SQL e SQL JOIN Types Explained. Nossa SQL JOIN Cheat Sheet resume a sintaxe dos diferentes tipos de JOINs.

Conclusões:

Os tipos de JOIN incluem [INNER] JOIN, LEFT JOIN, RIGHT JOIN e FULL [OUTER] JOIN.

Dados para as perguntas 9 a 12

Nos exercícios 9 a 12, usaremos o conjunto de dados Museum conjunto de dados que consiste em três tabelas.

A tabela artists contém as seguintes colunas:

  • id - O ID do banco de dados de um determinado artista.
  • name - O nome do artista.
  • birth_year - O ano de nascimento do artista.
  • death_year - O ano em que o artista nasceu.
  • artistic_field - O campo principal do artista (por exemplo, pintura em aquarela, escultura, pintura a óleo).

A tabela museum contém as seguintes colunas:

  • id - O ID de um determinado museu.
  • name - O nome do museu.
  • country - O país onde o museu está localizado.

A tabela piece_of_art tabela contém as seguintes colunas:

  • id - O ID de uma determinada obra de arte.
  • name - O nome da obra.
  • artist_id - O ID do artista que criou essa obra.
  • museum_id - O ID do museu que tem essa obra em sua coleção.

Pergunta 9: Localizar artistas nascidos após 1800 e a arte que eles criaram

Pergunta:

Para cada artista que nasceu após o ano de 1800 e viveu por mais de 50 anos, mostre o nome dele e o nome das obras de arte que ele criou. Renomeie as colunas como artist_name e piece_name, respectivamente.

Resposta:

SELECT
  a.name AS artist_name,
  poa.name AS piece_name
FROM artist a
JOIN piece_of_art poa
  ON a.id = poa.artist_id
WHERE death_year - birth_year > 50
  AND birth_year > 1800;

Explicação:

Selecionamos os nomes dos artistas (com o pseudônimo artist_name) juntamente com as obras de arte que eles criaram (com o pseudônimo piece_name). Portanto, devemos unir a tabela artist (identificada como a) com a tabela piece_of_art (com o pseudônimo poa) em sua coluna comum que armazena IDs de artistas (ON a.id = poa.artist_id).

Queremos considerar apenas os artistas que viveram por mais de 50 anos. Para definir essa condição, usaremos as colunas birth_year e death_year da tabela de artistas da seguinte forma:

death_year - birth_year > 50

Além disso, queremos listar os artistas nascidos depois de 1800: birth_year > 1800.

Confira este artigo sobre como unir duas tabelas no SQL para saber mais.

Pergunta 10: Selecionar todas as peças de arte e sua localização

Questão:

Selecione os nomes de todas as obras de arte junto com os nomes dos museus que as abrigam e os países em que esses museus estão localizados. Mostre também as obras de arte perdidas (aquelas sem um museu associado).

Resposta:

SELECT
  poa.name,
  m.name,
  m.country
FROM piece_of_art poa
LEFT JOIN museum m
  ON poa.museum_id = m.id;

Explicação:

Como queremos selecionar os nomes das obras de arte e os nomes e países dos museus, devemos unir a tabela piece_of_art (com o pseudônimo poa) com a tabela museum tabela (com o pseudônimo m) na coluna de ID do museu (ON poa.museum_id = m.id).

Precisamos mostrar todas as obras de arte, inclusive as que estão perdidas. Observe que as obras de arte perdidas não têm nenhum museu atribuído. Portanto, precisamos de um tipo específico de JOIN que selecione todos os dados da tabela piece_of_art independentemente de haver registros correspondentes na tabela museum tabela:

FROM piece_of_art poa LEFT JOIN museum m

Esse LEFT JOIN garante que selecionemos todas as linhas da tabela da esquerda (aqui, piece_of_art).

Confira este artigo sobre LEFT JOIN para saber mais.

Pergunta 11: Listar todas as obras de arte

Pergunta:

Mostre os nomes de todas as obras de arte, juntamente com os nomes de seus criadores e os nomes dos museus que abrigam essas obras de arte. Omita obras perdidas e obras de arte com um artista desconhecido. Nomeie as colunas piece_of_art_name, artist_name e museum_name.

Resposta:

SELECT
  a.name AS artist_name,
  m.name AS museum_name,
  poa.name AS piece_of_art_name
FROM museum m
JOIN piece_of_art poa
  ON m.id = poa.museum_id
JOIN artist a
  ON a.id = poa.artist_id;

Explicação:

Aqui selecionamos nomes de artistas da tabela artist nomes de museus da tabela museum e nomes de obras de arte da tabela piece_of_art da tabela. Portanto, devemos unir as três tabelas em suas colunas comuns:

  • Unimos a tabela museum com a tabela piece_of_art nos valores de ID do museu.
  • Unimos a tabela artist com a tabela piece_of_art tabela de valores de ID do artista.

Depois de unirmos as três tabelas, podemos selecionar os valores de saída.

Observe que queremos omitir obras de arte que não tenham nenhum museu ou artista atribuído. Portanto, usamos o padrão JOIN (ou INNER JOIN) que une dados de tabelas somente quando há uma correspondência na coluna em que o JOIN é executado.

Siga este artigo sobre como unir 3 ou mais tabelas para saber mais.

Pergunta 12: Liste obras de arte criadas por artistas desconhecidos

Questão:

Verifique se alguma obra foi criada por artistas desconhecidos. Mostre os nomes dessas obras juntamente com os nomes dos museus que as abrigam.

Resposta:

SELECT
  poa.name,
  m.name
FROM piece_of_art poa
JOIN museum m
  ON poa.museum_id = m.id
WHERE poa.artist_id IS NULL;

Explicação:

Queremos mostrar os nomes das peças de "artistas desconhecidos" junto com os nomes dos museus onde as peças estão localizadas. Portanto, juntamos a tabela piece_of_art (com o pseudônimo poa) com a tabela museum tabela (com o pseudônimo m) na coluna de ID do museu (ON poa.museum_id = m.id).

Como estamos procurando obras de arte criadas por artistas desconhecidos, incluímos a seguinte condição na cláusula WHERE: poa.artist_id IS NULL.

Agrupamento e agregação de dados

A agregação e o agrupamento são técnicas usadas para organizar dados em grupos com base em critérios definidos e realizar cálculos nos grupos.

Pergunta 13: Funções de agregação e o papel do GROUP BY

Questão:

Liste as funções de agregação disponíveis e explique a função da cláusula GROUP BY.

Resposta:

A agregação envolve a aplicação de operações matemáticas a um conjunto de valores em uma coluna. As funções de agregação mais comumente usadas incluem SUM(), AVG(), COUNT(), MAX(), e MIN().

Por exemplo, imagine uma tabela que armazena valores de vendas mensais:

yearmonthsales
2022115
2022124
202313
202326
202336
202344
202355

Você pode usar a função de agregação SUM() para obter o total de vendas, da seguinte forma:

SELECT SUM(sales) AS total_sales
FROM sales_table;

O resultado é o seguinte:

total_sales
33

Quando estamos agregando dados, também costumamos segmentá-los em grupos com base em valores distintos na coluna usada para agrupar dados.

O agrupamento envolve a criação de grupos de dados com base nos valores da(s) coluna(s) fornecidos como argumentos para a cláusula GROUP BY.

Por exemplo, imagine que você queira selecionar vendas por ano. Para fazer isso, você precisa agrupar os dados pelo ano, da seguinte forma:

SELECT year, SUM(sales) AS year_sales
FROM sales_table
GROUP BY year;

O resultado é o seguinte:

yearyear_sales
20229
202324

Se a coluna na qual agrupamos os dados tiver cinco valores distintos, os dados serão agrupados em cinco grupos.

Recomendamos este artigo se você quiser saber mais sobre a cláusula GROUP BY.

Conclusões:

A agregação consiste em realizar cálculos em um conjunto de valores e o agrupamento consiste em organizar os dados em grupos com base em critérios específicos.

Pergunta 14: WHERE vs. HAVING

Pergunta:

Qual é a diferença entre WHERE e HAVING?

Resposta:

Tanto o WHERE quanto o HAVING são usados para filtrar dados impondo determinadas condições.

A diferença é que WHERE é usado para impor condições às colunas de dados (como você viu na seção Consultas de tabela única ) e HAVING é usado para impor condições às funções agregadas (como você verá nesta seção).

Leia este artigo sobre WHERE vs. HAVING para saber mais sobre as diferenças entre essas duas cláusulas.

Conclusões:

WHERE WHERE impõe condições às colunas. HAVING impõe condições às funções de agregação.

Dados para as perguntas 15 a 18

Nos exercícios 15 a 18, usaremos a tabela games tabela. Ela consiste nas seguintes colunas:

  • id - O ID de um determinado jogo.
  • title - O nome do jogo (por exemplo, "Super Mario Bros").
  • company - O nome da empresa que produz esse jogo (por exemplo, "Nintendo").
  • type - O tipo de jogo (por exemplo, "arcade").
  • production_year - O ano em que o jogo foi criado.
  • system - O sistema para o qual o jogo foi lançado (por exemplo, "NES").
  • production_cost - O custo de produção do jogo.
  • revenue - A receita gerada pelo jogo.
  • rating - A classificação dada a esse jogo.

Pergunta 15: Calcule o custo médio de produção de bons jogos

Questão:

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

Resposta:

SELECT 
  AVG(production_cost)
FROM games
WHERE production_year BETWEEN 2010 AND 2015
  AND rating > 7;

Explicação:

Para selecionar o custo médio de produção dos jogos, usamos a função de agregação AVG() na coluna production_cost. Essa função pega todos os valores presentes na coluna production_cost e calcula a média.

Como estamos interessados em jogos produzidos entre 2010 e 2015, devemos incluir esta condição na cláusula WHERE: production_year BETWEEN 2010 AND 2015. Isso soa como um inglês simples!

Além disso, queremos incluir apenas jogos com classificação superior a 7, portanto, adicionamos outra condição na cláusula WHERE: AND rating > 7.

Confira este artigo sobre a função AVG() para ver mais exemplos.

Pergunta 16: Fornecer estatísticas de produção de jogos por ano

Pergunta:

Para cada ano:

  • Exibir o ano (production_year).
  • Conte o número de jogos lançados nesse ano (nomeie essa contagem).
  • Mostre o custo médio de produção (como avg_cost) para esses jogos.
  • Mostre a receita média (como avg_revenue) desses jogos.

Resposta:

SELECT
  production_year,
  COUNT(*) AS count,
  AVG(production_cost) AS avg_cost,
  AVG(revenue) AS avg_revenue
FROM games
GROUP BY production_year;

Explicação:

Queremos exibir estatísticas diferentes por ano; portanto, precisamos acessar GROUP BY production_year.

Ao selecionarmos na tabela games tabela, usamos a função de agregação COUNT() para contar os jogos lançados por ano. Usamos * como argumento porque queremos contar todas as linhas (não os valores de uma coluna específica). Usamos o pseudônimo AS count.

Em seguida, queremos exibir o custo médio de produção: AVG(production_cost). O codinome é AS avg_cost.

Por fim, mostramos a receita média: AVG(revenue). O codinome é AVG_revenue.

Pergunta 17: Calcular o lucro bruto por empresa

Questão:

Para todas as empresas presentes na games tabela, mostre o nome delas e o lucro bruto em todos os anos. Para simplificar esse problema, presuma que o lucro bruto é igual à receita menos o custo de produção de todos os jogos; nomeie essa coluna como gross_profit_sum. Ordene os resultados de modo que a empresa com o maior lucro bruto seja a primeira.

Resposta:

SELECT
  company,
  SUM(revenue - production_cost) AS gross_profit_sum
FROM games
GROUP BY 1
ORDER BY 2 DESC;

Explicação:

Selecionamos a coluna company da tabela games tabela. Para cada empresa, somamos os valores de lucro bruto (revenue - production_cost) produzidos por cada jogo criado por essa empresa.

Como queremos ver a soma do lucro bruto por empresa, devemos GROUP BY company. No entanto, nesse caso, usamos uma sintaxe diferente: GROUP BY 1, o que significa que queremos GROUP BY a coluna listada em SELECT.

Por fim, ordenamos o resultado em ordem decrescente com base nos valores de lucro bruto por empresa.

Pergunta 18: Identificar bons jogos

Pergunta:

Estamos interessados em bons jogos produzidos entre 2000 e 2009. Um bom jogo tem uma classificação maior que 6 e foi lucrativo. Para cada empresa, mostre:

  • O nome da empresa.
  • A receita total de jogos bons produzidos entre 2000 e 2009 (como a coluna revenue_sum ).
  • O número de jogos bons que a empresa produziu nesse período (como a coluna number_of_games ).

Importante: Mostre apenas as empresas com receita de jogos bons acima de 4.000.000.

Resposta:

SELECT
  company,
  COUNT(company) AS number_of_games,
  SUM(revenue) AS revenue_sum
FROM games
WHERE production_year BETWEEN 2000 AND 2009
  AND rating > 6
  AND revenue - production_cost > 0
GROUP BY company
HAVING SUM(revenue) > 4000000;

Explicação:

Esta é um pouco mais complicada, pois precisamos criar uma consulta que use WHERE, HAVING, funções de agregação e agrupamento.

Vamos analisar as instruções passo a passo e traduzi-las em código SQL.

WHERE-Instruções relacionadas:

  • jogos produzidos entre 2000 e 2009 resultam na adição desta condição à cláusula WHERE:
    WHERE production_year BETWEEN 2000 AND 2009
  • jogos com classificação superior a 6 resultam na adição dessa condição à cláusula WHERE:
    AND rating > 6
  • jogos que foram lucrativos resultam na adição dessa condição à cláusula WHERE:
    AND revenue - production_cost > 0
    Lembre-se, um jogo lucrativo significa que a receita é maior do que o custo de produção.

SELECT-instruções relacionadas:

  • mostrar o nome da empresa faz com que essa coluna seja adicionada à instrução SELECT:
    SELECT company
  • mostrar areceita total (como revenue_sum) faz com que essa coluna seja adicionada à instrução SELECT:
    SUM(revenue) AS revenue_sum
  • mostraro número de jogos bons (number_of_games) faz com que essa coluna seja adicionada ao demonstrativo SELECT:
    COUNT(company) AS number_of_games

GROUP BY- and HAVING-instruções relacionadas:

  • para cada empresa significa que calculamos as estatísticas (COUNT() e SUM()) em uma empresa. Portanto, devemos agrupar os dados por empresa:
    GROUP BY company
  • mostrar empresas com receita de bom jogo acima de 4.000.000 resulta na adição dessa condição à cláusula HAVING:
    HAVING SUM(revenue) > 4000000

Foi assim que dissecamos as instruções e as traduzimos em código SQL.

Mais informações básicas Trilha de Práticas em SQL

Este artigo abordou os conceitos básicos das consultas SQL, inclusive como filtrar dados, unir várias tabelas, ordenar e classificar resultados e agregar e agrupar dados.

Você gostou dos exercícios práticos de SQL até agora? Todos esses exercícios são provenientes de nosso Curso de Práticas em SQL curso. Para obter mais exercícios de SQL, confira estes cursos práticos em LearnSQL.com.br:

Você pode comprar cada um desses cursos individualmente ou pode adquirir nosso pacote Ilimitado Vitalício SQL. Ele abrange todos os mais de 70 cursos de SQL oferecidos em nossa plataforma, inclusive esses cursos práticos e todos os novos cursos que adicionaremos no futuro.

E lembre-se: a prática leva à perfeição. Boa sorte em sua jornada SQL!