Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026
Banco de Dados›Consultas e Comandos em SQL
Código
fc142088
Banca
FCC
Órgão
MPE SE
Ano
2026
Cargo
Ana ( )
No banco de dados de um Ministério Publico, há uma tabela chamada Denuncia, com os campos DenunciaID, TipoInfracao e Cidade. A equipe de analistas precisa calcular quantas denúncias existem por cidade. Para isso, deve usar a consulta SQL ANSI
ASELECT Cidade, COUNT (*) FROM Denuncia ORDER BY Cidade;
BSELECT COUNT(*) FROM Denuncia GROUP BY Cidade;
CSELECT Cidade, COUNT (*) FROM Denuncia;
DSELECT Cidade, COUNT (*) FROM Denuncia GROUP BY Cidade;
ESELECT Cidade, COUNT (TipoInfracao) FROM Denuncia WHERE COUNT (*) > 1;
Revelar gabarito e comentário▾
GabaritoD — SELECT Cidade, COUNT (*) FROM Denuncia GROUP BY Cidade;
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: agrupamento com GROUP BY e funções de agregação
Gabarito: letra D. Para calcular quantas denúncias existem por cidade, é necessário agrupar os registros pela coluna Cidade e contar as linhas de cada grupo — exatamente o que faz a consulta SELECT Cidade, COUNT(*) FROM Denuncia GROUP BY Cidade;. A cláusula GROUP BY é o mecanismo padrão da linguagem SQL para agregar dados em grupos, e a função COUNT(*) conta o número de linhas de cada grupo.
A consulta SQL é a ferramenta central para recuperar e manipular dados em bancos relacionais. Quando precisamos resumir informações — como contar, somar, calcular médias — usamos as funções de agregação (COUNT, SUM, AVG, MAX, MIN). Essas funções operam sobre um conjunto de linhas e retornam um único valor. O desafio surge quando queremos aplicar a agregação por categoria (no caso, por cidade): aí entra a cláusula GROUP BY, que divide as linhas da tabela em grupos com base nos valores de uma ou mais colunas, e a função de agregação é aplicada a cada grupo separadamente.
A sintaxe básica é:
SELECT coluna_agrupada, FUNCAO_AGREGACAO(coluna)
FROM tabela
GROUP BY coluna_agrupada;
No nosso caso, coluna_agrupada é Cidade e a função é COUNT(*). O * dentro do COUNT conta todas as linhas do grupo, independentemente de haver valores nulos em alguma coluna — é a forma mais comum e segura de contar registros. Poderíamos usar também COUNT(DenunciaID), que contaria apenas as linhas onde DenunciaID não é nulo (o que, sendo chave primária, daria o mesmo resultado).
Vamos a um exemplo concreto. Suponha que a tabela Denuncia tenha os seguintes registros:
DenunciaID
TipoInfracao
Cidade
1
Furto
São Paulo
2
Furto
São Paulo
3
Roubo
Campinas
4
Furto
Campinas
5
Roubo
São Paulo
A consulta SELECT Cidade, COUNT(*) FROM Denuncia GROUP BY Cidade; produziria:
Cidade
COUNT(*)
São Paulo
3
Campinas
2
Perceba que cada cidade aparece uma única vez, com o total de denúncias correspondente. É exatamente isso que o enunciado pede.
Agora, vamos entender por que as outras alternativas estão erradas — e aqui mora a pegadinha clássica da banca: confundir a necessidade do GROUP BY com outras cláusulas.
Alternativa A — ❌ Incorreta
A consulta SELECT Cidade, COUNT(*) FROM Denuncia ORDER BY Cidade; está errada porque usa ORDER BY (que apenas ordena o resultado) no lugar de GROUP BY (que agrupa). Sem o agrupamento, a função COUNT(*) seria aplicada a todas as linhas da tabela, retornando um único valor — o total geral de denúncias — e a consulta falharia ou retornaria um resultado sem sentido, pois misturaria uma coluna não agregada (Cidade) com uma agregação sem grupo. Em bancos como o MySQL, isso até executa (retornando uma cidade arbitrária e o total geral), mas não atende ao requisito de contar por cidade. O ORDER BY só faz sentido depois do GROUP BY, para ordenar os grupos resultantes.
Alternativa B — ❌ Incorreta
SELECT COUNT(*) FROM Denuncia GROUP BY Cidade; está errada porque, embora agrupe por cidade, não seleciona a coluna Cidade no SELECT. O resultado seria apenas uma lista de contagens, sem indicar a qual cidade cada contagem corresponde — inútil para o analista que precisa saber quantas denúncias há por cidade. A regra prática: toda coluna que aparece no GROUP BY deve aparecer no SELECT (ou ser usada em uma função de agregação), para que o resultado seja interpretável.
Alternativa C — ❌ Incorreta
SELECT Cidade, COUNT(*) FROM Denuncia; está errada porque não possui nenhuma cláusula de agrupamento. A função COUNT(*) seria aplicada a todas as linhas da tabela, retornando um único número (o total de denúncias), e a coluna Cidade não poderia ser exibida junto sem agrupamento — em SQL padrão, isso é um erro de sintaxe (coluna não agregada sem GROUP BY). Faltou o GROUP BY Cidade para que a contagem seja feita por cidade.
Alternativa D — ✅ Correta ⟵ GABARITO
SELECT Cidade, COUNT(*) FROM Denuncia GROUP BY Cidade; é a consulta correta. Ela agrupa as linhas da tabela pelos valores distintos da coluna Cidade e, para cada grupo, conta o número de linhas com COUNT(*). O resultado é uma tabela com duas colunas: Cidade e a contagem de denúncias daquela cidade. É exatamente o que o enunciado pede: "calcular quantas denúncias existem por cidade".
Alternativa E — ❌ Incorreta
SELECT Cidade, COUNT(TipoInfracao) FROM Denuncia WHERE COUNT(*) > 1; está errada por dois motivos graves. Primeiro, a cláusula WHEREnão pode conter funções de agregação — ela filtra linhas individuais antes do agrupamento; para filtrar grupos, usa-se a cláusula HAVING. Segundo, mesmo que trocássemos WHERE por HAVING, a consulta ainda estaria incompleta: faltaria o GROUP BY Cidade, sem o qual a agregação não faz sentido por cidade. A forma correta de filtrar grupos com mais de uma denúncia seria: SELECT Cidade, COUNT(*) FROM Denuncia GROUP BY Cidade HAVING COUNT(*) > 1; — mas isso não é o que o enunciado pede, pois ele quer todas as cidades, não apenas as que têm mais de uma denúncia.
NÃO CAIA NESSA!
A banca adora trocar GROUP BY por ORDER BY (alternativa A) ou simplesmente omitir o agrupamento (alternativa C). Lembre-se: GROUP BYagrupa para aplicar funções de agregação por categoria; ORDER BY apenas ordena o resultado final. E nunca use WHERE com funções de agregação — para filtrar grupos, o correto é HAVING.
PEGA ESSA DICA!
Na hora da prova, identifique o verbo do enunciado: "por cidade", "por tipo", "por mês" indicam agrupamento. Monte a consulta mentalmente: SELECT <coluna do grupo>, <função de agregação> FROM <tabela> GROUP BY <coluna do grupo>;. Se a questão pedir apenas o total geral, sem "por", aí sim pode dispensar o GROUP BY.