Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2026

Banco de DadosSQL
Código
qg685943
Banca
FUNDATEC
Órgão
IFC-SC
Ano
2026
Nível
Superior
Cargo
Professor EBTT - Informática: Engenharia de Software e Banco de Dados
O domínio da linguagem SQL exige do analista a compreensão da correta ordem de execução lógica e restrição de cláusulas de agregação. Considere o seguinte modelo de dados relacional de uma instituição acadêmica (chaves primárias sublinhadas):Pesquisador (ID_Pesq, Nome)Projeto (ID_Proj, Titulo)Atuacao (ID_Pesq, ID_Proj, Horas_Semanais)Um analista precisa escrever uma consulta SQL que retorne o nome dos pesquisadores e a quantidade de projetos em que atuam, considerando apenas as atuações com mais de 10 horas semanais. Além disso, o relatório final deve exibir apenas os pesquisadores que possuam participação em mais de 2 projetos (já obedecendo ao critério mínimo de horas). O resultado deve ser ordenado pela quantidade de projetos em ordem decrescente.Assinale a alternativa que apresenta o comando SQL sintática e logicamente correto para satisfazer todos os requisitos dessa regra de negócio.
  1. ASELECT P.Nome, COUNT(A.ID_Proj)FROM Pesquisador PINNER JOIN Atuacao A ON P.ID_Pesq = A.ID_PesqWHERE COUNT(A.ID_Proj) > 2GROUP BY P.ID_Pesq, P.NomeHAVING A.Horas_Semanais > 10ORDER BY COUNT(A.ID_Proj) DESC;
  2. BSELECT P.Nome, COUNT(A.ID_Proj)FROM Pesquisador PINNER JOIN Atuacao A ON P.ID_Pesq = A.ID_PesqWHERE A.Horas_Semanais > 10GROUP BY P.ID_Pesq, P.NomeHAVING COUNT(A.ID_Proj) > 2ORDER BY COUNT(A.ID_Proj) DESC;
  3. CSELECT P.Nome, COUNT(A.ID_Proj)FROM Pesquisador PINNER JOIN Atuacao A ON P.ID_Pesq = A.ID_PesqWHERE A.Horas_Semanais > 10 OR COUNT(A.ID_Proj) > 2GROUP BY P.ID_Pesq, P.NomeORDER BY COUNT(A.ID_Proj) ASC;
  4. DSELECT P.Nome, COUNT(A.ID_Proj)FROM Pesquisador PINNER JOIN Atuacao A ON P.ID_Pesq = A.ID_PesqGROUP BY P.ID_Pesq, P.NomeHAVING A.Horas_Semanais > 10 AND COUNT(A.ID_Proj) > 2ORDER BY COUNT(A.ID_Proj) DESC;
  5. ESELECT P.Nome, COUNT(A.ID_Proj)FROM Pesquisador PINNER JOIN Atuacao A ON P.ID_Pesq = A.ID_PesqWHERE A.Horas_Semanais > 10 AND COUNT(A.ID_Proj) > 2GROUP BY P.ID_Pesq, P.NomeORDER BY P.Nome DESC;
Revelar gabarito e comentário

GabaritoB — SELECT P.Nome, COUNT(A.ID_Proj) FROM Pesquisador P INNER JOIN Atuacao A ON P.ID_Pesq = A.ID_Pesq WHERE A.Horas_Semanais > 10 GROUP BY P.ID_Pesq, P.Nome HAVING COUNT(A.ID_Proj) > 2 ORDER BY COUNT(A.ID_Proj) DESC;

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: Ordem de Execução e Cláusulas de Agregação

Gabarito: letra B. A consulta deve filtrar as linhas com horas > 10 (WHERE), agrupar por pesquisador (GROUP BY), reter apenas grupos com mais de 2 projetos (HAVING), e ordenar decrescentemente pelo total de projetos (ORDER BY). A alternativa B é a única que respeita a ordem lógica de execução do SQL: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.

Abaixo, a ordem correta aplicada ao problema:

Critério

Alternativa A

Alternativa B (Gabarito)

Alternativa C

Alternativa D

Alternativa E

WHERE com agregação (COUNT)

❌ Inválido

✅ Não usa

❌ Inválido

✅ Não usa

❌ Inválido

Filtro de horas (WHERE)

❌ Ausente (no HAVING)

✅ Correto

✅ Presente (mas com OR inválido)

❌ Ausente (no HAVING)

✅ Presente (mas com AND inválido)

Filtro de projetos (HAVING)

❌ Ausente (no WHERE)

✅ Correto

❌ Ausente

❌ Incorreto (horas no HAVING)

❌ Ausente

Ordenação decrescente

✅ Sim

✅ Sim

❌ Ascendente

✅ Sim

❌ Por nome

Ordem lógica SQL

❌ Violada

✅ Correta

❌ Violada

❌ Violada

❌ Violada

Alternativa A — ❌ Incorreta

  • WHERE COUNT(A.ID_Proj) > 2: funções de agregação (COUNT) não são permitidas no WHERE, pois a agregação ocorre após a filtragem de linhas. O correto é usar HAVING.

  • HAVING A.Horas_Semanais > 10: HAVING é para condições sobre grupos, não sobre linhas individuais. O filtro por horas deve estar no WHERE.

Alternativa B — ✅ Correta ⟵ GABARITO

  • WHERE A.Horas_Semanais > 10: filtra corretamente as linhas antes da agregação.

  • GROUP BY P.ID_Pesq, P.Nome: agrupa por pesquisador (a coluna ID_Pesq é suficiente, mas incluir Nome é necessário para aparecer no SELECT).

  • HAVING COUNT(A.ID_Proj) > 2: filtra grupos com mais de 2 projetos.

  • ORDER BY COUNT(A.ID_Proj) DESC: ordena decrescente pelo total de projetos.

Alternativa C — ❌ Incorreta

  • WHERE A.Horas_Semanais > 10 OR COUNT(A.ID_Proj) > 2: uso inválido de agregação no WHERE.

  • ORDER BY COUNT(A.ID_Proj) ASC: ordenação ascendente, não descendente.

Alternativa D — ❌ Incorreta

  • Sem cláusula WHERE: não filtra as horas mínimas. O filtro por horas está no HAVING, mas HAVING só aceita condições sobre colunas de agregação ou colunas do GROUP BY. A coluna A.Horas_Semanais não está nem agregada nem no GROUP BY, causando erro.

Alternativa E — ❌ Incorreta

  • WHERE A.Horas_Semanais > 10 AND COUNT(A.ID_Proj) > 2: uso inválido de agregação no WHERE.

  • Sem HAVING: não há filtro após o GROUP BY.

  • ORDER BY P.Nome DESC: ordenação por nome, não pela quantidade de projetos.

NÃO CAIA NESSA!

A banca inverte o papel do WHERE (filtra linhas individuais) com o HAVING (filtra grupos). É clássico: tentar usar agregados no WHERE ou colunas não agregadas no HAVING. Memorize a ordem: WHERE antes, HAVING depois do GROUP BY.

Gabarito: letra B.

Link permanente: /questoes/qg685943