Considere o banco de dados a seguir: Professor (Nome, Códig...
Professor (Nome, Código, I.D., Salário) Aluno (Nome, Matrícula, Data-Nasc, Endereço) Disciplina (Nome, Código, Horas-Semanais) Leciona (Código-Prof, Código-Discip) Matriculado-em (Matrícula, Código-Discip, Nota)
Em relação ao comando em SQL para mostrar todas as disciplinas que tiverem mais de três alunos, foram propostos os seguintes comandos:
I. SELECT cod_disc FROM matriculado_em GROUP BY cod_disc HAVING COUNT(1) > 3 II. SELECT cod_disc FROM matriculado_em GROUP BY cod_disc where COUNT(1) > 3 III. SELECT cod_disc FROM matriculado_em HAVING COUNT(1) > 3 IV. SELECT cod_disc FROM matriculado_em where COUNT(1) > 3
Está(ão) correto(s)
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: A - I.
Tema central da questão:
Esta questão exige o entendimento de agrupamento e filtragem de resultados em SQL, especialmente sobre o uso dos comandos GROUP BY e HAVING. É um tema fundamental porque, em bancos de dados relacionais, frequentemente precisamos contar registros agrupados e filtrar grupos com base em condições sobre agregações, como quantidade de alunos por disciplina.
Resumo teórico:
O comando GROUP BY em SQL agrupa linhas que têm valores iguais em colunas especificadas e permite aplicar funções de agregação (COUNT, SUM, AVG, etc.) nesses grupos. Já o HAVING serve para filtrar esses grupos com base em resultados de funções de agregação. O WHERE filtra linhas antes do agrupamento e NÃO pode ser usado para filtrar agregações (MariaDB/MySQL, PostgreSQL, Oracle - veja documentação oficial SQL ANSI).
Justificativa da alternativa correta:
A opção I utiliza corretamente:
SELECT cod_disc FROM matriculado_em GROUP BY cod_disc HAVING COUNT(1) > 3
Nesse comando, agrupamos por cod_disc e usamos HAVING para filtrar apenas os grupos onde a contagem de alunos é maior que três. É exatamente o que o enunciado pede.
Análise das alternativas incorretas:
- II. Usa WHERE depois do GROUP BY, o que é incorreto, pois WHERE não filtra agregações. O correto seria HAVING.
- III. Tenta usar HAVING sem GROUP BY. Isso só funciona se todas as linhas forem de um mesmo grupo, o que não é o caso. Logo, a consulta não retorna o resultado esperado.
- IV. Usa WHERE COUNT(1) > 3 sem GROUP BY, o que é sintaticamente inválido em SQL padrão.
Estratégia de interpretação:
Ao analisar questões de SQL, observe sempre se estão usando WHERE ou HAVING. Lembre-se: HAVING é para filtrar resultados de funções de agregação após o agrupamento; WHERE é para filtrar linhas antes do agrupamento. Questões costumam misturar propositalmente os termos para confundir.
Resumo final: Apenas a alternativa I está correta.
Gostou do comentário? Deixe sua avaliação aqui embaixo!
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo