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.
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;
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;
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;
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;
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.