Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2025

Banco de DadosConsultas e Comandos em SQL
Código
fc150367
Banca
FCC
Órgão
TRT 2
Ano
2025
Cargo
AJ TRT2
Um Analista Judiciário de um Tribunal Regional do Trabalho está desenvolvendo uma rotina em Transact-SQL (T-SQL) para gerar um relatório de auditoria. O sistema registra alterações em tabelas sensíveis, como "Processos", "Partes" e "Audiências". A tabela: log_alteracoes armazena os dados com as seguintes colunas:   id_log (int): identificador da alteração; tabela_afetada (varchar): nome da tabela alterada; usuario (varchar): usuário que realizou a alteração; data_alteracao (datetime): data e hora da alteração.   O objetivo é retornar, para cada usuário, a última data em que ele alterou qualquer registro da tabela "Processos", mediante o uso correto da consulta
  1. ASELECT usuario, data_alteracao FROM log_alteracoes WHERE tabela_afetada = 'Processos' GROUP BY usuario, data_alteracao HAVING data_alteracao = MAX(data_alteracao)
  2. BSELECT usuario, MAX(data_alteracao) AS ultima_alteracao FROM log_alteracoes WHERE tabela_afetada = 'Processos' GROUP BY usuario;
  3. CSELECT usuario, MAX(data_alteracao) FROM log_alteracoes WHERE tabela_afetada = 'Processos';
  4. DSELECT DISTINCT usuario, data_alteracao FROM log_alteracoes WHERE tabela_afetada = 'Processos' ORDER BY data_alteracao DESC;
  5. ESELECT usuario, data_alteracao FROM log_alteracoes WHERE tabela_afetada = 'Processos' AND data_alteracao = MAX(data_alteracao) GROUP BY usuario;
Revelar gabarito e comentário

GabaritoB — SELECT usuario, MAX(data_alteracao) AS ultima_alteracao FROM log_alteracoes WHERE tabela_afetada = 'Processos' GROUP BY usuario;

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: agregação com GROUP BY e MAX

Gabarito: letra B. Para retornar, para cada usuário, a última data em que ele alterou a tabela "Processos", a consulta correta agrupa os registros por usuario e aplica a função de agregação MAX(data_alteracao) — é o padrão clássico de "maior valor por grupo" em SQL. As demais alternativas ou usam MAX de forma incorreta (fora de um contexto de agregação válido), ou não agregam os dados, retornando todas as alterações em vez da última de cada usuário.

A questão cobra um dos padrões mais fundamentais de consulta em SQL: a combinação de GROUP BY com funções de agregação. Quando o objetivo é obter um valor resumido (máximo, mínimo, soma, contagem, média) para cada grupo de linhas, a estrutura correta é SELECT coluna_do_grupo, FUNCAO_AGREGACAO(coluna_valor) FROM tabela WHERE ... GROUP BY coluna_do_grupo. A função MAX retorna o maior valor de uma coluna dentro de cada grupo — no caso, a data mais recente de alteração para cada usuário. O WHERE filtra as linhas antes do agrupamento, garantindo que apenas os registros da tabela "Processos" sejam considerados.

Vamos entender o porquê de cada parte. O WHERE tabela_afetada = 'Processos' restringe o conjunto de dados apenas às alterações feitas na tabela de interesse. O GROUP BY usuario divide essas linhas em grupos, um para cada usuário distinto. Por fim, MAX(data_alteracao) calcula, dentro de cada grupo, a data mais recente. O resultado é uma linha por usuário, com a última data de alteração — exatamente o que o relatório de auditoria pede.

A pegadinha da banca está em alternativas que tentam usar MAX fora de um contexto de agregação válido. Em SQL, funções de agregação como MAX, MIN, SUM, COUNT e AVG só podem ser usadas em duas situações: na lista de seleção acompanhadas de GROUP BY, ou na cláusula HAVING. Usar MAX diretamente no WHERE ou no HAVING sem agrupamento é um erro de sintaxe — o WHERE não aceita funções de agregação, e o HAVING exige que a consulta tenha GROUP BY. Além disso, incluir data_alteracao no GROUP BY (como na alternativa A) quebra o agrupamento por usuário, pois cada combinação distinta de usuário e data vira um grupo separado.

Guarde a estrutura canônica: SELECT coluna_grupo, FUNCAO(coluna_valor) FROM tabela WHERE filtro GROUP BY coluna_grupo. É exatamente nela que as alternativas se dividem — as incorretas ou violam a sintaxe de agregação, ou não agrupam corretamente.

  1. 1WHERE filtra linhas
  2. 2GROUP BY divide grupos
  3. 3MAX calcula por grupo
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Inclui data_alteracao no GROUP BY, o que faz com que cada combinação distinta de usuario e data_alteracao vire um grupo separado. O resultado seria uma linha para cada alteração, não uma linha por usuário com a última data. Além disso, HAVING data_alteracao = MAX(data_alteracao) é inválido: o HAVING exige que a condição seja sobre o grupo (usando funções de agregação), mas aqui compara uma coluna não agregada com uma função de agregação, o que não faz sentido semântico e viola as regras do SQL.

Alternativa B — ✅ Correta ⟵ GABARITO

Esta é a estrutura correta: SELECT usuario, MAX(data_alteracao) AS ultima_alteracao FROM log_alteracoes WHERE tabela_afetada = 'Processos' GROUP BY usuario. O WHERE filtra apenas os registros da tabela "Processos", o GROUP BY usuario agrupa por usuário, e MAX(data_alteracao) retorna a data mais recente de cada grupo. O resultado é exatamente uma linha por usuário com a última data de alteração.

Alternativa C — ❌ Incorreta

Falta o GROUP BY usuario. Sem ele, a consulta tenta usar MAX(data_alteracao) sem agrupamento, o que é um erro de sintaxe em SQL padrão — funções de agregação na lista de seleção exigem GROUP BY quando há outras colunas não agregadas. Além disso, mesmo que funcionasse, retornaria apenas uma linha com o máximo global, não o máximo por usuário.

Alternativa D — ❌ Incorreta

Usa SELECT DISTINCT usuario, data_alteracao, que retorna todas as combinações distintas de usuário e data — ou seja, todas as alterações, não apenas a última de cada usuário. O ORDER BY data_alteracao DESC apenas ordena o resultado, mas não filtra para a data mais recente de cada usuário. Não há agregação alguma.

Alternativa E — ❌ Incorreta

Usa MAX(data_alteracao) dentro do WHERE, o que é inválido — o WHERE não aceita funções de agregação. Além disso, a condição data_alteracao = MAX(data_alteracao) compararia cada data com o máximo global, não com o máximo por usuário. Mesmo que a sintaxe fosse corrigida, a lógica estaria errada.

NÃO CAIA NESSA!

A banca explora a confusão entre usar MAX no WHERE (inválido) e usá-lo na lista de seleção com GROUP BY (correto). Muitos candidatos tentam "filtrar" pela data máxima no WHERE, mas a forma certa é agregar por grupo. Lembre-se: funções de agregação nunca vão no WHERE — elas vão na lista de seleção (com GROUP BY) ou no HAVING.

PEGA ESSA DICA!

Para identificar a consulta correta de "maior valor por grupo", procure a estrutura SELECT coluna_grupo, MAX(coluna_valor) ... GROUP BY coluna_grupo. Se a alternativa usar MAX no WHERE ou no HAVING sem GROUP BY, descarte na hora. Treine com variações: "última compra de cada cliente", "maior salário por departamento" — o padrão é sempre o mesmo.

Gabarito: letra B

Link permanente: /questoes/fc150367