Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
fc150361
Banca
FCC
Órgão
SEFAZ PI
Ano
2025
Cargo
AFFE ( )
A Secretaria da Fazenda (Sefaz) deseja identificar contribuintes do regime normal de apuração do ICMS que apresentaram valores a recolher maiores que R$ 20.000,00 no mês de março de 2025, conforme os dados da tabela declaracoes_fiscais (com campos: cnpj, regime, periodo, valor_icms_recolher). Para isso, um técnico escreveu a seguinte consulta SQL padrão ANSI: SELECT cnpj, valor_icms_recolher FROM declaracoes_fiscais WHERE regime = 'NORMAL' AND periodo = '2025-03' AND valor_icms_recolher > 20000; Uma Auditora Fiscal afirmou que a consulta
Aprecisa obrigatoriamente agrupar o campo valor_icms_recolher com GROUP BY para que o filtro > 20000 funcione corretamente.
Bdeveria usar a cláusula HAVING em vez de WHERE para filtrar o valor do ICMS a recolher.
Cdeveria usar a função CAST para garantir que o valor seja comparado como DECIMAL, evitando erros de tipo.
Ddeveria substituir a cláusula WHERE por ON, por se tratar de dados condicionais.
Eestá tecnicamente correta dentro do padrão ANSI SQL e atende ao objetivo proposto.
Revelar gabarito e comentário▾
GabaritoE — está tecnicamente correta dentro do padrão ANSI SQL e atende ao objetivo proposto.
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: filtro com WHERE em coluna individual
Gabarito: letra E. A consulta está tecnicamente correta dentro do padrão ANSI SQL e atende ao objetivo proposto, pois utiliza a cláusula WHERE para filtrar linhas individuais com base em condições simples sobre colunas (regime, periodo e valor_icms_recolher), sem necessidade de GROUP BY, HAVING, CAST ou ON. A cláusula WHERE é exatamente o mecanismo adequado para filtrar registros antes de qualquer agregação, e a comparação valor_icms_recolher > 20000 é válida para valores numéricos.
A consulta apresentada é um exemplo clássico de filtragem de linhas em SQL. O comando SELECT seleciona as colunas cnpj e valor_icms_recolher da tabela declaracoes_fiscais, aplicando três condições na cláusula WHERE: o regime deve ser 'NORMAL', o período deve ser '2025-03' e o valor do ICMS a recolher deve ser maior que 20000. Todas essas condições são aplicadas a cada linha individualmente, e apenas as linhas que atendem a todas elas são retornadas no resultado.
A cláusula WHERE é a ferramenta correta para filtrar linhas com base em valores de colunas. Ela é aplicada antes de qualquer agrupamento ou agregação, e sua função é restringir o conjunto de linhas que serão processadas. No caso da consulta, não há necessidade de agrupar dados, pois o objetivo é listar contribuintes individuais que atendem aos critérios, e não resumir informações por grupo. Portanto, o uso de GROUP BY ou HAVING seria desnecessário e até incorreto para este cenário.
A distinção fundamental entre WHERE e HAVING é que WHERE filtra linhas individuais antes do agrupamento, enquanto HAVING filtra grupos após o agrupamento. Como a consulta não utiliza GROUP BY, a cláusula HAVING não se aplica. Da mesma forma, CAST não é necessário porque a comparação valor_icms_recolher > 20000 é feita entre valores numéricos, e o banco de dados realiza a conversão implícita quando necessário. A cláusula ON é usada em junções (JOIN) para especificar a condição de junção entre tabelas, e não para filtrar dados de uma única tabela.
A banca explora a confusão entre WHERE e HAVING, que é uma pegadinha clássica em questões de SQL. O candidato pode ser induzido a pensar que, por se tratar de um valor a recolher, seria necessário usar HAVING ou GROUP BY. No entanto, a consulta é simples e não envolve agregação, tornando o WHERE a escolha correta. A alternativa E reconhece corretamente que a consulta está bem formulada e atende ao objetivo proposto.
Guarde a fronteira entre WHERE e HAVING: WHERE filtra linhas, HAVING filtra grupos. É exatamente nessa distinção que as alternativas se dividem.
Cláusulas de filtro em SQL: WHERE (Filtra linhas individuais, Antes do agrupamento, Uso: colunas sem agregação); HAVING (Filtra grupos, Após GROUP BY, Uso: com funções agregadas); ON (Condição de junção, Uso: em JOIN entre tabelas); CAST (Conversão de tipo, Uso: quando há incompatibilidade)
Alternativa A — ❌ Incorreta
A consulta não precisa de GROUP BY para que o filtro > 20000 funcione. GROUP BY é usado para agrupar linhas com base em valores de colunas, geralmente combinado com funções de agregação como COUNT, SUM, AVG, MAX e MIN. Nesta consulta, não há agregação; o objetivo é listar linhas individuais que atendem aos critérios. O filtro > 20000 é aplicado diretamente na coluna valor_icms_recolher de cada linha, e o WHERE é o mecanismo correto para isso. A alternativa confunde o uso de GROUP BY com a necessidade de filtrar valores, o que é incorreto.
Alternativa B — ❌ Incorreta
A cláusula HAVING é usada para filtrar grupos após o agrupamento com GROUP BY. Como a consulta não utiliza GROUP BY, HAVING não se aplica. O filtro valor_icms_recolher > 20000 é uma condição sobre uma coluna individual, e o WHERE é a cláusula correta para esse tipo de filtro. A alternativa inverte o papel das cláusulas: WHERE filtra linhas, HAVING filtra grupos. Usar HAVING sem GROUP BY seria um erro de sintaxe ou lógica, dependendo do SGBD.
Alternativa C — ❌ Incorreta
A função CAST é usada para converter um valor de um tipo de dado para outro, como de VARCHAR para DECIMAL. Nesta consulta, a comparação valor_icms_recolher > 20000 é feita entre valores numéricos, e o banco de dados realiza a conversão implícita quando necessário. Não há necessidade de CAST para garantir a comparação, pois o tipo da coluna valor_icms_recolher já é numérico (presumivelmente DECIMAL ou NUMERIC). A alternativa sugere uma preocupação desnecessária com tipos de dados que não se aplica ao contexto.
Alternativa D — ❌ Incorreta
A cláusula ON é usada em junções (JOIN) para especificar a condição de junção entre duas ou mais tabelas. Nesta consulta, há apenas uma tabela (declaracoes_fiscais), e não há junção. O WHERE é a cláusula correta para filtrar linhas de uma única tabela. A alternativa confunde o uso de ON (junção) com o de WHERE (filtro), o que é um erro conceitual.
Alternativa E — ✅ Correta ⟵ GABARITO
A consulta está tecnicamente correta dentro do padrão ANSI SQL. Ela seleciona as colunas cnpj e valor_icms_recolher da tabela declaracoes_fiscais, aplicando três condições na cláusula WHERE: regime = 'NORMAL', periodo = '2025-03' e valor_icms_recolher > 20000. Todas as condições são aplicadas a cada linha individualmente, e apenas as linhas que atendem a todas elas são retornadas. Não há necessidade de GROUP BY, HAVING, CAST ou ON, pois a consulta é simples e não envolve agregação ou junção. A consulta atende ao objetivo proposto de identificar contribuintes do regime normal que apresentaram valores a recolher maiores que R$ 20.000,00 em março de 2025.
NÃO CAIA NESSA!
A banca adora inverter o papel das cláusulas WHERE e HAVING para confundir. Nesta questão, a alternativa B tenta fazer você acreditar que HAVING seria necessário, mas HAVING só é usado com GROUP BY para filtrar grupos. Como a consulta não agrupa, WHERE é a escolha certa. Com treino, você enxerga essas trocas de longe 💪
PEGA ESSA DICA!
Para questões de SQL, lembre-se da ordem lógica de execução: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Se a consulta não tem GROUP BY, HAVING não se aplica. Filtros em colunas individuais sempre usam WHERE.