Questão de Banco de Dados — Banco de Dados Relacionais — INSTITUTO AOCP 2024
Banco de Dados›Banco de Dados Relacionais
Código
qg261787
Banca
INSTITUTO AOCP
Órgão
SANEPAR
Ano
2024
Nível
Superior
Cargo
Profissional - Analista de Informática
Como analista de informática da Sanepar, você foi incumbido de manipular o banco de dados da empresa para realizar uma consulta SQL (Structured Query Language) específica. Seu chefe solicitou que você extraísse uma lista contendo o identificador, nome e salário dos funcionários que recebem os três maiores salários na empresa, além disso, esses funcionários devem ter dependentes que estejam frequentando a escola. A consulta deve utilizar as tabelas Funcionários e Dependentes, e os salários devem estar ordenados do maior para o menor. Nesse contexto, assinale a alternativa que apresenta a consulta que atende às necessidades da tarefa que você deverá realizar.
ASELECT f.FuncionarioID, f.Nome, f.SalarioFROM Funcionarios fJOIN Dependentes d ON f.FuncionarioID =d.FuncionarioIDWHERE d.Escola != ‘Sim’GROUP BY f.FuncionarioID, f.Nome, f.SalarioHAVING COUNT(d.DependenteID) > 0ORDER BY f.Salario ASCLIMIT < 3;
BSELECT f.FuncionarioID, f.Nome, f.SalarioFROM Funcionarios fJOIN Dependentes d ON f.FuncionarioID =d.FuncionarioIDWHERE d.Escola != ‘Sim’GROUP BY f.FuncionarioID, f.Nome, f.SalarioHAVING COUNT(d.DependenteID) > 0ORDER BY f.Salario ASCLIMIT 3;
CSELECT f.FuncionarioID, f.Nome, f.SalarioFROM Funcionarios fJOIN Dependentes d ON f.FuncionarioID !=d.FuncionarioIDWHERE d.Escola = ‘Sim’GROUP BY f.FuncionarioID, f.Nome, f.SalarioHAVING COUNT(d.DependenteID) < 0ORDER BY f.Salario DESCLIMIT 3;
DSELECT f.FuncionarioID, f.Nome, f.SalarioFROM Funcionarios fJOIN Dependentes d ON f.FuncionarioID =d.FuncionarioIDWHERE d.Escola = ‘Sim’GROUP BY f.FuncionarioID, f.Nome, f.SalarioHAVING COUNT(d.DependenteID) > 0ORDER BY f.Salario DESCLIMIT 3;
ESELECT f.FuncionarioID, f.Nome, f.SalarioFROM Funcionarios fJOIN Dependentes d ON f.FuncionarioID !=d.FuncionarioIDWHERE d.Escola = ‘Sim’GROUP BY f.FuncionarioID, f.Nome, f.SalarioHAVING COUNT(d.DependenteID) > 0ORDER BY f.Salario DESCLIMIT 3;
Revelar gabarito e comentário▾
GabaritoD — SELECT f.FuncionarioID, f.Nome, f.Salario
FROM Funcionarios f
JOIN Dependentes d ON f.FuncionarioID =
d.FuncionarioID
WHERE d.Escola = ‘Sim’
GROUP BY f.FuncionarioID, f.Nome, f.Salario
HAVING COUNT(d.DependenteID) > 0
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”.
Consulta SQL: junção, filtro, agrupamento e ordenação
Gabarito: letra D. A alternativa D é a única que combina corretamente todos os requisitos: junção interna (INNER JOIN) entre Funcionarios e Dependentes pela chave estrangeira, filtro de dependentes que frequentam a escola (d.Escola = 'Sim'), agrupamento por funcionário com HAVING COUNT(d.DependenteID) > 0 para garantir que tenha ao menos um dependente, ordenação decrescente de salário (ORDER BY f.Salario DESC) e limitação a 3 registros (LIMIT 3).
A questão exige a construção de uma consulta SQL que atenda a múltiplos critérios simultaneamente. Vamos decompor cada exigência do enunciado e ver como ela se traduz em cláusulas SQL:
Lista com identificador, nome e salário dos funcionários: isso define a projeção SELECT f.FuncionarioID, f.Nome, f.Salario.
Funcionários que recebem os três maiores salários: isso exige ordenação decrescente (ORDER BY f.Salario DESC) e limitação do número de linhas (LIMIT 3).
Devem ter dependentes que estejam frequentando a escola: isso exige uma junção com a tabela Dependentes (JOIN Dependentes d ON f.FuncionarioID = d.FuncionarioID) e um filtro na coluna que indica se o dependente frequenta a escola (WHERE d.Escola = 'Sim').
Salários ordenados do maior para o menor: reforça a necessidade de ORDER BY f.Salario DESC.
A combinação de JOIN com WHERE e GROUP BY/HAVING é um padrão comum para filtrar registros que possuem pelo menos um registro relacionado que atenda a uma condição. O JOIN combina as linhas das duas tabelas; o WHERE filtra as linhas combinadas; o GROUP BY agrupa os resultados por funcionário; e o HAVING filtra os grupos, permitindo usar funções de agregação como COUNT.
A pegadinha central está em três pontos: (1) a condição de junção deve ser de igualdade (=), não de diferença (!=); (2) o filtro da escola deve ser = 'Sim', não != 'Sim'; e (3) a ordenação deve ser DESC, não ASC. Além disso, o LIMIT deve ser um número inteiro, não uma expressão como LIMIT < 3. Vamos analisar cada alternativa para ver onde cada uma falha.
Critério
Alternativa D (correta)
Alternativas A, B, C, E (incorretas)
Junção (JOIN)
ON f.FuncionarioID = d.FuncionarioID (igualdade, relaciona corretamente)
Esta alternativa tem dois erros graves. Primeiro, o filtro WHERE d.Escola != 'Sim' seleciona dependentes que não frequentam a escola, exatamente o oposto do pedido. Segundo, a cláusula LIMIT < 3 é sintaticamente inválida — o LIMIT espera um número inteiro, não uma expressão de comparação. Além disso, a ordenação ASC (crescente) contraria a exigência de listar os maiores salários primeiro.
Alternativa B — ❌ Incorreta
Esta alternativa corrige o LIMIT para LIMIT 3, mas mantém os dois outros erros: o filtro WHERE d.Escola != 'Sim' continua selecionando dependentes que não frequentam a escola, e a ordenação ORDER BY f.Salario ASC lista os salários do menor para o maior, invertendo a ordem pedida.
Alternativa C — ❌ Incorreta
Esta alternativa acerta o filtro da escola (d.Escola = 'Sim') e a ordenação (DESC), mas erra na condição de junção: ON f.FuncionarioID != d.FuncionarioID faz um produto cartesiano de todos os funcionários com todos os dependentes que não têm o mesmo ID, o que é semanticamente incorreto e não representa o relacionamento entre as tabelas. Além disso, a condição HAVING COUNT(d.DependenteID) < 0 é logicamente impossível, pois uma contagem nunca é negativa — ela deveria ser > 0 para garantir que o funcionário tenha ao menos um dependente.
Alternativa D — ✅ Correta ⟵ GABARITO
Esta alternativa atende a todos os requisitos:
JOIN Dependentes d ON f.FuncionarioID = d.FuncionarioID: junção correta pela chave estrangeira.
WHERE d.Escola = 'Sim': filtra apenas dependentes que frequentam a escola.
GROUP BY f.FuncionarioID, f.Nome, f.Salario: agrupa por funcionário (necessário para usar COUNT).
HAVING COUNT(d.DependenteID) > 0: garante que o funcionário tenha pelo menos um dependente na escola (na prática, redundante com o WHERE, mas correto).
ORDER BY f.Salario DESC: ordena do maior para o menor salário.
LIMIT 3: limita o resultado aos três primeiros, que são os três maiores salários.
Alternativa E — ❌ Incorreta
Esta alternativa repete o erro da alternativa C na condição de junção: ON f.FuncionarioID != d.FuncionarioID. Apesar de acertar o filtro da escola, o HAVING e a ordenação, a junção incorreta invalida a consulta, pois não relaciona corretamente funcionários e seus dependentes.