Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — INSTITUTO AOCP 2024

Banco de DadosBanco 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.
  1. 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;
  2. 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;
  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;
  4. 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;
  5. 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:

  1. Lista com identificador, nome e salário dos funcionários: isso define a projeção SELECT f.FuncionarioID, f.Nome, f.Salario.

  2. 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).

  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').

  4. 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)

A/B: igualdade correta; C/E: != (produto cartesiano, errado)

Filtro escola

WHERE d.Escola = 'Sim' (frequenta a escola)

A/B: != 'Sim' (não frequenta, invertido); C/E: = 'Sim' (correto)

Agrupamento/HAVING

GROUP BY + HAVING COUNT > 0 (garante ≥1 dependente)

A/B: COUNT > 0 correto; C: COUNT < 0 (impossível); E: COUNT > 0 correto

Ordenação

ORDER BY f.Salario DESC (maior → menor)

A/B: ASC (menor → maior, invertido); C/E: DESC (correto)

Limite

LIMIT 3 (válido)

A: LIMIT < 3 (sintaxe inválida); B/C/E: LIMIT 3 (válido)

Alternativa A — ❌ Incorreta

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.

Gabarito: letra D

Link permanente: /questoes/qg261787