Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024
Banco de Dados›Consultas e Comandos em SQL
Código
qa630707
Banca
FUNDATEC
Órgão
CETENE
Ano
2024
Cargo
Tecno P ( )
Para responder a questão abaixo, considere o modelo entidade-relacionamento (ER) apresentado pela figura abaixo:
Figura 1 - Modelo entidade - realcionamento (ER)
Considerando o modelo ER apresentado pela Figura 1, pretende-se implementar uma expressão SQL para apresentar reg_descricao de Regiao, bem como a quantidade de registros de Unidade associados a cada Regiao, ignorando os registros de Regiao cuja quantidade de Unidade seja zero. Analise as assertivas abaixo e assinale a alternativa correta.
I. select reg_descricao, sum(*)
from Regiao R
inner join Unidade U on R.reg_id = U.reg_id
group by R.reg_id
II. select reg_descricao, count(*)
from Regiao R
inner join Unidade U on R.reg_id = U.reg_id
group by R.reg_id
III. select reg_descricao, count(*)
from Regiao R
inner join Unidade U on R.reg_id = U.reg_id
having count(*) > 0
group by R.reg_id
ATodas as assertivas estão corretas.
BTodas as assertivas estão incorretas.
CApenas a assertiva I está correta.
DApenas a assertiva II está correta.
EApenas as assertivas II e III estão corretas.
Revelar gabarito e comentário▾
GabaritoD — Apenas a assertiva II está correta.
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”.
Consultas SQL: GROUP BY, COUNT e HAVING
Gabarito: letra D — apenas a assertiva II está correta. A consulta II usa count(*) com GROUP BY, que é a forma correta de contar registros por grupo; a I usa sum(*), que é inválido (a função SUM exige um argumento numérico, não um asterisco); e a III inverte a ordem das cláusulas HAVING e GROUP BY, o que gera erro de sintaxe.
A ideia por trás
A questão cobra o domínio de duas cláusulas fundamentais do SQL para agregação: GROUP BY e HAVING. O GROUP BY agrupa linhas que possuem o mesmo valor em uma ou mais colunas, permitindo que funções de agregação (como COUNT, SUM, AVG, MAX, MIN) sejam aplicadas a cada grupo. A cláusula HAVING é usada para filtrar os grupos após a agregação, funcionando como um WHERE para grupos. A ordem correta das cláusulas em uma consulta SQL é: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
No contexto do enunciado, queremos listar a descrição de cada região e a quantidade de unidades associadas a ela, ignorando as regiões sem unidades. O INNER JOIN entre Regiao e Unidade já garante que apenas regiões com pelo menos uma unidade apareçam no resultado, pois a junção interna descarta linhas sem correspondência. Portanto, o HAVING count(*) > 0 é redundante, mas não incorreto — o problema da assertiva III é a ordem das cláusulas.
Análise das assertivas
1SELECT
2FROM
3WHERE
4GROUP BY
5HAVING
6ORDER BY
LEVEL · soulevel.com.br
Assertiva I — ❌ Incorreta
A consulta usa sum(*), que é inválido. A função SUM é uma função de agregação que soma valores numéricos de uma coluna específica, como SUM(quantidade). O asterisco (*) não é um argumento válido para SUM, pois ele representa todas as colunas, e a soma de colunas não numéricas não faz sentido. Para contar registros, a função correta é COUNT(*) ou COUNT(1). Portanto, a assertiva I está incorreta.
Assertiva II — ✅ Correta ⟵ GABARITO
A consulta usa count(*) com GROUP BY R.reg_id, que é a forma correta de contar o número de registros de Unidade associados a cada Regiao. O INNER JOIN garante que apenas regiões com pelo menos uma unidade sejam incluídas, e o GROUP BY agrupa os resultados por região, permitindo que COUNT(*) conte quantas unidades cada região possui. A consulta está sintaticamente correta e atende ao requisito do enunciado.
Assertiva III — ❌ Incorreta
A consulta apresenta erro de sintaxe porque a cláusula HAVING está posicionada antes do GROUP BY. A ordem correta das cláusulas em SQL é: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY. O HAVING deve vir depois do GROUP BY, pois ele filtra grupos já formados. Além disso, o HAVING count(*) > 0 é redundante, pois o INNER JOIN já exclui regiões sem unidades, mas o erro principal é a ordem das cláusulas.
NÃO CAIA NESSA!
A banca troca a ordem das cláusulas HAVING e GROUP BY na assertiva III. O candidato desatento pode achar que a ordem não importa, mas em SQL a ordem é rígida: GROUP BY vem antes de HAVING. Além disso, a assertiva I usa sum(*), que é inválido — SUM exige um argumento numérico, não um asterisco. Fique atento a essas inversões clássicas.
PEGA ESSA DICA!
Para resolver questões de SQL, memorize a ordem das cláusulas: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY. E lembre-se: COUNT(*) conta linhas, SUM(coluna) soma valores de uma coluna. Se a questão pedir para ignorar grupos com contagem zero, o INNER JOIN já resolve, tornando o HAVING desnecessário.