Questão de Banco de Dados — Consultas e Comandos em SQL — INSTITUTO AOCP 2025
Banco de Dados›Consultas e Comandos em SQL
Código
qa698936
Banca
INSTITUTO AOCP
Órgão
MPE RS
Ano
2025
Cargo
Tec MP ( )
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: \bullet são naturais de Porto Alegre; \bullet possuem pelo menos um dependente; \bullet estão entre os três com os maiores salários; \bullet se autodeclaram pardos. Com base nesses critérios, assinale a alternativa que apresenta a consulta SQL (Structured Query Language) correta para atender à solicitação.
ASELECT f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidade FROM funcionarios f LEFT 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' ORDER BY f.salario DESC LIMIT 3;
BSELECT 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 HAVING 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 DESC LIMIT 3;
CSELECT 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;
DSELECT 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' OR f.naturalidade = 'Porto Alegre' OR f.cor_raca = 'Pardo' ORDER BY f.salario DESC LIMIT 3;
ESELECT 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' ORDER BY f.salario DESC LIMIT 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”.
Consultas SQL: filtros, junções e agrupamento
Gabarito: letra C. A consulta correta combina a junção interna (JOIN) para garantir que o funcionário tenha ao menos um dependente, o filtro WHERE com os critérios de órgão, naturalidade e cor/raça, e o GROUP BY para eliminar as duplicações geradas pela junção, antes de ordenar por salário e limitar a três registros. As demais alternativas falham por usar LEFT JOIN (incluiria funcionários sem dependentes), HAVING sem GROUP BY (sintaxe inválida), OR em vez de AND (afrouxaria os critérios) ou negações (!=) que invertem a lógica pedida.
O problema central desta questão é entender como a junção com a tabela de dependentes afeta o resultado. Quando fazemos JOIN dependentes d ON f.id = d.funcionario_id, cada funcionário que tem mais de um dependente aparecerá mais de uma vez no resultado — uma linha para cada dependente. Isso é um efeito colateral clássico da junção: ela multiplica as linhas da tabela da esquerda pelo número de correspondências na tabela da direita.
Para ilustrar, imagine que o funcionário João tenha dois dependentes. A consulta com JOIN retornará duas linhas para João, uma para cada dependente. Se não fizermos nada para eliminar essa duplicação, o LIMIT 3 pode retornar apenas João (duas linhas) e mais um funcionário, em vez de três funcionários distintos. É exatamente para resolver isso que a alternativa correta usa GROUP BY f.id, f.nome, f.cargo, f.salario, f.cor_raca, f.naturalidade — ela agrupa as linhas duplicadas de cada funcionário em uma única linha.
A alternativa A usa LEFT JOIN, que preserva todos os funcionários da tabela da esquerda, mesmo aqueles sem dependentes. Isso viola o critério "possuem pelo menos um dependente", pois funcionários sem dependentes (com d.funcionario_id nulo) também seriam incluídos. A alternativa B usa HAVING sem GROUP BY, o que é uma sintaxe inválida na maioria dos SGBDs — o HAVING só pode ser usado após um GROUP BY. A alternativa D usa OR em vez de AND, o que afrouxa os critérios: um funcionário que atenda a apenas um dos três critérios (órgão, naturalidade ou cor/raça) seria incluído. A alternativa E usa != (diferente), invertendo completamente a lógica — ela selecionaria funcionários que não são do MPRS, não são de Porto Alegre e não se autodeclaram pardos.
A pegadinha aqui é dupla: primeiro, a banca testa se você sabe que a junção interna (JOIN) é a correta para filtrar quem tem dependente, e não a LEFT JOIN. Segundo, testa se você percebe que a junção gera duplicações e que o GROUP BY é necessário para eliminá-las antes do LIMIT. Sem o GROUP BY, o LIMIT 3 pode retornar menos de três funcionários distintos, ou até mesmo o mesmo funcionário repetido, dependendo de quantos dependentes ele tem.
Guarde esta sequência mental para resolver qualquer questão de SQL com junção e limite: 1) identifique se a junção deve ser interna (JOIN) ou externa (LEFT JOIN) — se o critério é "ter pelo menos um", é interna; 2) verifique se a junção pode gerar duplicações — se sim, o GROUP BY é necessário; 3) confira se os filtros usam AND (todos os critérios) ou OR (qualquer critério); 4) confira se a ordenação e o limite estão corretos. É exatamente nesses quatro pontos que as alternativas se dividem.
1JOIN interno ou LEFT?
2GROUP BY p/ duplicações?
3AND ou OR nos filtros?
4ORDER BY e LIMIT corretos?
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Usa LEFT JOIN, que inclui todos os funcionários da tabela funcionarios, mesmo aqueles sem nenhum dependente. Como o critério é "possuem pelo menos um dependente", a junção correta é a interna (JOIN), que só retorna funcionários com correspondência na tabela dependentes. A LEFT JOIN retornaria funcionários sem dependentes com valores nulos nas colunas de dependentes, violando o critério.
Alternativa B — ❌ Incorreta
Usa HAVING sem GROUP BY. A cláusula HAVING é usada para filtrar grupos após a agregação, e só pode ser aplicada quando há um GROUP BY. Sem ele, a consulta é sintaticamente inválida na maioria dos SGBDs (como PostgreSQL, MySQL e SQL Server). Além disso, mesmo que fosse válida, o HAVING não é o lugar para filtrar linhas individuais — isso é função do WHERE.
Alternativa C — ✅ Correta ⟵ GABARITO
Esta é a consulta correta. O JOIN interno garante que apenas funcionários com pelo menos um dependente sejam retornados. O WHERE aplica os três critérios com AND: órgão, naturalidade e cor/raça. O GROUP BY elimina as duplicações geradas pela junção, garantindo que cada funcionário apareça apenas uma vez. O ORDER BY f.salario DESC ordena do maior para o menor salário, e o LIMIT 3 retorna apenas os três primeiros — exatamente os três com maiores salários.
Alternativa D — ❌ Incorreta
Usa OR em vez de AND nos filtros do WHERE. Isso significa que um funcionário que atenda a apenas um dos critérios (por exemplo, ser do MPRS, mas não ser de Porto Alegre nem pardo) seria incluído no resultado. O critério correto é que todos os três filtros sejam verdadeiros simultaneamente, o que exige AND.
Alternativa E — ❌ Incorreta
Usa != (diferente) em todos os filtros, invertendo completamente a lógica. Esta consulta retornaria funcionários que não são do MPRS, não são de Porto Alegre e não se autodeclaram pardos — exatamente o oposto do que foi solicitado. Além disso, também não usa GROUP BY, então sofreria do mesmo problema de duplicação da alternativa A.