Pular para o conteúdo principal

Questão de Banco de Dados — SQL — INSTITUTO AOCP 2025

Banco de DadosSQL
Código
qg540899
Banca
INSTITUTO AOCP
Órgão
MPE-RS
Ano
2025
Nível
Médio
Cargo
Técnico do Ministério Público - Informática
Um técnico de informática no MPRS recebeu a tarefa de gerar um relatório sobre funcionários que atendem a critérios específicos. O levantamento deve listar os funcionários do MPRS que:• são naturais de Porto Alegre;• possuem pelo menos um dependente;• estão entre os três com os maiores salários;• se autodeclaram pardos.Com base nesses critérios, assinale a alternativa que apresenta a consulta SQL (Structured Query Language) correta para atender à solicitação.
  1. ASELECT f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidadeFROM funcionarios fLEFT JOIN dependentes d ON f.id = d.funcionario_idWHERE f.orgao = 'Ministério Público do Rio Grande do Sul'AND f.naturalidade = 'Porto Alegre'AND f.cor_raca = 'Pardo'ORDER BY f.salario DESCLIMIT 3;
  2. BSELECT f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidadeFROM funcionarios fJOIN dependentes d ON f.id = d.funcionario_idHAVING f.orgao = 'Ministério Público do Rio Grande do Sul'AND f.naturalidade = 'Porto Alegre'AND f.cor_raca = 'Pardo'ORDER BY f.salario DESCLIMIT 3;
  3. CSELECT f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidadeFROM funcionarios fJOIN dependentes d ON f.id = d.funcionario_idWHERE f.orgao = 'Ministério Público do Rio Grande do Sul'AND f.naturalidade = 'Porto Alegre'AND f.cor_raca = 'Pardo'GROUP BY f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidadeORDER BY f.salario DESCLIMIT 3;
  4. DSELECT f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidadeFROM funcionarios fJOIN dependentes d ON f.id = d.funcionario_idWHERE f.orgao = 'Ministério Público do Rio Grande do Sul'OR f.naturalidade = 'Porto Alegre'OR f.cor_raca = 'Pardo'ORDER BY f.salario DESCLIMIT 3;
  5. ESELECT f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidadeFROM funcionarios fJOIN dependentes d ON f.id = d.funcionario_idWHERE f.orgao != 'Ministério Público do Rio Grande do Sul'AND f.naturalidade != 'Porto Alegre'AND f.cor_raca != 'Pardo'ORDER BY f.salario DESCLIMIT 3;
Revelar gabarito e comentário

GabaritoC — SELECT f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidade FROM funcionarios f JOIN dependentes d ON f.id = d.funcionario_id WHERE f.orgao = 'Ministério Público do Rio Grande do Sul' AND f.naturalidade = 'Porto Alegre' AND f.cor_raca = 'Pardo' GROUP BY f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidade ORDER BY f.salario DESC LIMIT 3;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL: consulta com junção, filtros e agregação

Gabarito: letra C. A consulta correta precisa combinar a tabela funcionarios com dependentes (para garantir que o funcionário tenha pelo menos um dependente), aplicar os filtros de orgao, naturalidade e cor_raca no WHERE, agrupar por funcionário com GROUP BY (para eliminar duplicações causadas pela junção) e então ordenar por salário decrescente com LIMIT 3 para pegar os três maiores. A alternativa C é a única que atende a todos esses requisitos.

O problema central desta questão é entender como a junção (JOIN) entre as tabelas funcionarios e dependentes afeta o resultado. Quando fazemos JOIN dependentes d ON f.id = d.funcionario_id, cada funcionário que tem múltiplos dependentes aparecerá múltiplas vezes no resultado — uma vez para cada dependente. Isso é um problema porque o relatório deve listar funcionários, não combinações de funcionário-dependente. Se um funcionário tem 3 dependentes, ele aparecerá 3 vezes na consulta sem GROUP BY, o que inflaria o resultado e poderia fazer com que o LIMIT 3 retornasse menos funcionários distintos do que o esperado.

A solução é usar GROUP BY para agrupar as linhas por funcionário. Ao agrupar por todas as colunas selecionadas (f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidade), cada funcionário aparece exatamente uma vez no resultado, independentemente de quantos dependentes tenha. O GROUP BY é essencial aqui porque, sem ele, a consulta retornaria linhas duplicadas para funcionários com múltiplos dependentes, e o LIMIT 3 poderia retornar, por exemplo, 3 linhas do mesmo funcionário, em vez de 3 funcionários diferentes.

Vamos analisar cada cláusula da alternativa correta:

  • JOIN dependentes d ON f.id = d.funcionario_id: garante que apenas funcionários com pelo menos um dependente sejam incluídos (junção interna).

  • WHERE f.orgao = 'Ministério Público do Rio Grande do Sul' AND f.naturalidade = 'Porto Alegre' AND f.cor_raca = 'Pardo': aplica os três filtros de atributos do funcionário.

  • GROUP BY f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidade: agrupa as linhas por funcionário, eliminando duplicações causadas pela junção.

  • ORDER BY f.salario DESC: ordena os funcionários do maior para o menor salário.

  • LIMIT 3: limita o resultado aos três primeiros registros, ou seja, os três com maiores salários.

A pegadinha desta questão está na necessidade do GROUP BY. Muitos candidatos podem achar que o JOIN sozinho é suficiente, mas sem o GROUP BY, funcionários com múltiplos dependentes apareceriam várias vezes, distorcendo o resultado. A alternativa A usa LEFT JOIN, que incluiria funcionários sem dependentes (violando o critério de "pelo menos um dependente"). A alternativa B usa HAVING incorretamente, pois HAVING é para filtrar grupos após a agregação, não para filtrar linhas individuais. A alternativa D usa OR em vez de AND, o que relaxaria os filtros. A alternativa E inverte os filtros com !=, excluindo exatamente os funcionários que deveriam ser incluídos.

  1. 1JOIN dependentes (tem ≥1 dependente)
  2. 2WHERE com AND (órgão, naturalidade, cor)
  3. 3GROUP BY (elimina duplicações)
  4. 4ORDER BY salário DESC
  5. 5LIMIT 3 (maiores salários)
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Usa LEFT JOIN, que inclui todos os funcionários da tabela funcionarios, mesmo aqueles sem dependentes. Como o critério exige "pelo menos um dependente", o LEFT JOIN viola essa condição, pois funcionários sem dependentes também seriam retornados (com valores NULL nas colunas de dependentes). O correto é usar JOIN (junção interna), que só retorna funcionários que têm correspondência na tabela dependentes.

Alternativa B — ❌ Incorreta

Usa HAVING para filtrar as condições de orgao, naturalidade e cor_raca. O HAVING é uma cláusula que filtra grupos após a agregação (usada com GROUP BY), não linhas individuais. Como não há GROUP BY nesta consulta, o HAVING não pode ser usado dessa forma. Além disso, mesmo que houvesse GROUP BY, o HAVING não é o lugar apropriado para filtrar atributos que não são agregados — isso deve ser feito no WHERE.

Alternativa C — ✅ Correta ⟵ GABARITO

Esta é a consulta correta. Ela usa JOIN para garantir que apenas funcionários com dependentes sejam incluídos, aplica os filtros no WHERE com AND, usa GROUP BY para eliminar duplicações causadas pela junção, ordena por salário decrescente e limita a 3 registros. A combinação de JOIN + GROUP BY é essencial para que cada funcionário apareça apenas uma vez, mesmo que tenha múltiplos dependentes.

Alternativa D — ❌ Incorreta

Usa OR em vez de AND nos filtros do WHERE. Isso faz com que a consulta retorne funcionários que atendam a QUALQUER um dos critérios (órgão, naturalidade ou cor/raça), em vez de TODOS eles. Por exemplo, um funcionário de Porto Alegre que não seja pardo seria incluído, o que viola os critérios do relatório.

Alternativa E — ❌ Incorreta

Inverte os filtros usando != (diferente). Isso faz com que a consulta retorne funcionários que NÃO são do MPRS, NÃO são de Porto Alegre e NÃO são pardos — exatamente o oposto do que foi solicitado. O correto seria usar = para selecionar os funcionários que atendem aos critérios.

A regra de ouro para questões de SQL com junções e agregações é: sempre verifique se o GROUP BY é necessário para eliminar duplicações causadas pelo JOIN, e lembre-se de que WHERE filtra linhas antes da agregação, enquanto HAVING filtra grupos depois da agregação.

Gabarito: letra C

Link permanente: /questoes/qg540899