Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024

Banco de DadosConsultas 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:

Imagem associada para resolução da questão

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


  1. ATodas as assertivas estão corretas.
  2. BTodas as assertivas estão incorretas.
  3. CApenas a assertiva I está correta.
  4. DApenas a assertiva II está correta.
  5. 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

  1. 1SELECT
  2. 2FROM
  3. 3WHERE
  4. 4GROUP BY
  5. 5HAVING
  6. 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.

Gabarito: letra D

Link permanente: /questoes/qa630707