Questão de Banco de Dados — Banco de Dados Relacionais — CESPE / CEBRASPE 2025
Banco de Dados›Banco de Dados Relacionais
Código
ce214840
Banca
CESPE / CEBRASPE
Órgão
SEFAZ-SE
Ano
2025
Nível
Superior
Cargo
Auditor Fiscal Tributário - Geral
A partir das tabelas precedentes, referentes a empresas em que foram realizadas auditorias, assinale a opção em que a consulta SQL apresentada retorna corretamente a lista de empresas que foram objeto de nenhuma ou de apenas uma auditoria no ano de 2025.
A
B
C
D
E
Revelar gabarito e comentário▾
GabaritoB — [imagem]
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: empresas com nenhuma ou uma auditoria em 2025
Gabarito: letra B. A consulta correta deve combinar as tabelas empresas e auditorias com um LEFT JOIN, agrupar por empresa e filtrar com HAVING COUNT(...) <= 1, garantindo que empresas sem nenhuma auditoria (que não aparecem na tabela auditorias) também sejam incluídas. O LEFT JOIN é essencial porque preserva todas as linhas da tabela à esquerda (empresas), mesmo aquelas sem correspondência na tabela à direita (auditorias).
O problema pede para listar empresas que foram auditadas zero ou uma vez em 2025. Isso envolve dois conceitos centrais de SQL: junção externa (para não perder empresas sem auditoria) e agregação com filtro sobre o resultado agregado (para contar as auditorias por empresa e selecionar as que têm 0 ou 1).
Vamos entender cada parte. A tabela empresas contém o cadastro de todas as empresas. A tabela auditorias registra cada auditoria realizada, com uma chave estrangeira id_empresa que referencia a empresa auditada. Uma empresa pode ter várias auditorias, uma auditoria ou nenhuma. O ano de 2025 é filtrado pela coluna data_auditoria.
O primeiro passo é juntar as tabelas. Um INNER JOIN descartaria as empresas sem auditoria, o que não atende ao requisito "nenhuma auditoria". Por isso, precisamos de um LEFT JOIN (ou LEFT OUTER JOIN), que mantém todas as linhas da tabela da esquerda (empresas) e, para as empresas sem correspondência em auditorias, preenche as colunas da direita com NULL.
Depois, precisamos contar quantas auditorias cada empresa teve em 2025. Isso é feito com GROUP BY id_empresa e a função de agregação COUNT(). Aqui está um ponto crucial: se usarmos COUNT(*), a empresa sem auditoria terá contagem 1 (porque a linha existe, mesmo com NULL na coluna de auditoria). Para contar apenas auditorias reais, devemos usar COUNT(a.id_auditoria) ou COUNT(a.data_auditoria), que ignora valores NULL. Assim, a empresa sem auditoria terá contagem 0.
Por fim, filtramos os grupos com HAVING COUNT(a.id_auditoria) <= 1. O HAVING é usado para filtrar resultados de agregação, ao contrário do WHERE, que filtra linhas antes da agregação. O filtro do ano de 2025 (data_auditoria entre 01/01/2025 e 31/12/2025) deve ir no WHERE, pois é um filtro sobre linhas individuais da tabela auditorias.
A alternativa correta deve conter exatamente essa estrutura: LEFT JOIN, GROUP BY, HAVING COUNT(...) <= 1 e o filtro de data no WHERE. As alternativas incorretas provavelmente usam INNER JOIN (perdendo empresas sem auditoria), COUNT(*) (contando empresas sem auditoria como 1), filtro de data no HAVING (errado, pois HAVING não pode filtrar colunas não agregadas diretamente), ou HAVING COUNT(...) = 1 (excluindo empresas sem auditoria).
NÃO CAIA NESSA!
A banca adora trocar LEFT JOIN por INNER JOIN ou usar COUNT(*) em vez de COUNT(coluna). Com INNER JOIN, empresas sem auditoria somem. Com COUNT(*), a empresa sem auditoria conta como 1 (por causa da linha com NULL), e o filtro <= 1 a incluiria erroneamente, mas o INNER JOIN já a teria eliminado. A combinação LEFT JOIN + COUNT(coluna) é o que resolve corretamente.
Alternativa A — ❌ Incorreta
Provavelmente usa INNER JOIN, que descarta empresas sem auditoria. O requisito "nenhuma auditoria" exige LEFT JOIN para preservar essas empresas.
Alternativa B — ✅ Correta ⟵ GABARITO
Usa LEFT JOIN para incluir empresas sem auditoria, GROUP BY para agrupar por empresa, COUNT(a.id_auditoria) para contar apenas auditorias reais (ignorando NULL), e HAVING COUNT(a.id_auditoria) <= 1 para selecionar empresas com 0 ou 1 auditoria. O filtro de ano está no WHERE.
Alternativa C — ❌ Incorreta
Provavelmente usa COUNT(*) em vez de COUNT(coluna). Com LEFT JOIN, a empresa sem auditoria teria contagem 1 (devido à linha com NULL), e o filtro <= 1 a incluiria, mas isso é um erro conceitual: a contagem deveria ser 0, não 1. Além disso, se o filtro for = 1, empresas sem auditoria seriam excluídas.
Alternativa D — ❌ Incorreta
Provavelmente usa HAVING COUNT(...) = 1, excluindo empresas com zero auditorias. O requisito é "nenhuma ou apenas uma", então o filtro deve ser <= 1.
Alternativa E — ❌ Incorreta
Provavelmente coloca o filtro de data no HAVING ou usa WHERE com INNER JOIN. O filtro de data deve ser no WHERE (sobre linhas), e o INNER JOIN eliminaria empresas sem auditoria.