Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2025
Banco de Dados›Consultas e Comandos em SQL
Código
fg169072
Banca
FGV
Órgão
MPU
Ano
2025
Cargo
Ana
Observe a inserção dos registros pelo seguinte script SQL. INSERT INTO Parte (ParteID, idade) VALUES (1 ,17); INSERT INTO Parte (ParteID, idade) VALUES (2 ,16); INSERT INTO Processo (processoID, data_audiencia, valor_causa) VALUES (1 ,'2025-02-05',1000); INSERT INTO Processo (processoID, data_audiencia, valor_causa) VALUES (2 ,'2025-10-05',2000); INSERT INTO ProcessoParte (processoID, parteid) VALUES (1 ,1); INSERT INTO ProcessoParte (processoID, parteid) VALUES (2 ,2); No PostgreSQL, para consultar os Processos (Processos) que envolvem partes menores que 18 anos, por ordem de maior Valor de Causa (valor_causa), cuja Audiência (data_audiencia) está agendada para os próximos 30 dias, deve-se executar o comando SQL:
ASELECT p.processoid, p.valor_causa, p.data_audiencia FROM Parte pt, ProcessoParte pp , Processo p WHERE pp.parteid = pt.parteid and pp.processoid = p.processoid AND pt.idade < 18 AND p.data_audiencia BETWEEN NOW()::DATE AND NOW()::DATE + INTERVAL '30 days' ORDER BY p.valor_causa DESC
BSELECT p.processoid as numero, SUM(p.valor_causa) as ValorCausa, p.data_audiencia FROM processo p INNER JOIN parte pt ON pt.idade < 18 INNER JOIN ProcessoParte pp ON pp.parteid = pt.parteid WHERE p.data_audiencia BETWEEN NOW() AND NOW() + INTERVAL '30 days' GROUP BY p.processoid, p.data_audiencia ORDER BY ValorCausa DESC
CSELECT p.processoid as numero, SUM(p.valor_causa) as ValorCausa, p.data_audiencia as DataAudiencia FROM Processo p INNER JOIN ProcessoParte pp ON p.ProcessoID = pp.ProcessoID INNER JOIN Parte pt ON pp.ParteID = pt.ParteID WHERE pt.idade < 18 AND p.data_audiencia > NOW() + INTERVAL '30 days' GROUP BY p.processoid, p.data_audiencia ORDER BY ValorCausa ASC
DSELECT p.processoid as numero, p.valor_causa, p.data_audiencia FROM Parte pt INNER JOIN Processo p ON pt.idade < 18 AND p.data_audiencia BETWEEN NOW() AND CURRENT_DATE + DATE_PART('DAY', 30)
ESELECT p.processoid, p.valor_causa, p.data_audiencia FROM processo p INNER JOIN parte pt ON pt.idade < 18 WHERE p.data_audiencia BETWEEN NOW() AND NOW() + 30
Revelar gabarito e comentário▾
GabaritoA — SELECT p.processoid, p.valor_causa, p.data_audiencia
FROM Parte pt, ProcessoParte pp , Processo p
WHERE pp.parteid = pt.parteid and
pp.processoid = p.processoid
AND pt.idade < 18
AND p.data_audiencia BETWEEN
NOW()::DATE AND NOW()::DATE + INTERVAL '30 days'
ORDER BY p.valor_causa DESC
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 no PostgreSQL: junções, filtros e ordenação
Gabarito: letra A. A alternativa A é a única que combina corretamente os três requisitos do enunciado: junção entre as três tabelas (Parte, ProcessoParte e Processo), filtro de partes menores de 18 anos (pt.idade < 18), filtro de audiência nos próximos 30 dias (BETWEEN NOW()::DATE AND NOW()::DATE + INTERVAL '30 days') e ordenação decrescente pelo valor da causa (ORDER BY p.valor_causa DESC). As demais alternativas erram em pelo menos um desses pontos — seja na sintaxe da junção, no operador de intervalo, na direção da ordenação ou no uso indevido de agregação.
A questão exige a construção de uma consulta SQL que atenda a quatro condições simultâneas: (1) envolver partes menores de 18 anos; (2) ter audiência agendada para os próximos 30 dias; (3) ser ordenada pelo maior valor de causa; e (4) ser executada no PostgreSQL. Para isso, é preciso entender como funcionam as junções entre tabelas, o operador BETWEEN, a função NOW() e a cláusula ORDER BY.
Junções (JOIN): Para relacionar as tabelas Parte, ProcessoParte e Processo, é necessário usar uma junção. A sintaxe explícita INNER JOIN ... ON é a mais clara e recomendada, mas a sintaxe implícita (vírgula na cláusula FROM + condição no WHERE) também é válida e produz o mesmo resultado — é o que a alternativa A faz. O importante é que a condição de junção esteja correta: pp.parteid = pt.parteid (ligando a tabela associativa à Parte) e pp.processoid = p.processoid (ligando a tabela associativa ao Processo).
Filtro de idade: A condição pt.idade < 18 seleciona apenas as partes menores de 18 anos. Como a tabela Parte tem uma coluna idade, essa condição é direta.
Filtro de data: O enunciado pede audiências "agendadas para os próximos 30 dias". Isso significa que a data da audiência deve estar entre a data atual e a data atual mais 30 dias. O operador BETWEEN é o mais adequado, pois inclui os extremos. No PostgreSQL, NOW() retorna a data e hora atuais, e NOW()::DATE converte para apenas a data (sem hora). Somar INTERVAL '30 days' a uma data adiciona 30 dias. Portanto, BETWEEN NOW()::DATE AND NOW()::DATE + INTERVAL '30 days' captura exatamente o intervalo desejado.
Ordenação: O enunciado pede "por ordem de maior Valor de Causa", ou seja, do maior para o menor. Isso é feito com ORDER BY p.valor_causa DESC (decrescente).
Agregação: A alternativa B e C usam SUM(p.valor_causa) e GROUP BY. Isso é desnecessário e incorreto, pois o enunciado não pede soma de valores, mas sim a listagem dos processos com seus respectivos valores. Além disso, agrupar por processoid e data_audiencia sem necessidade pode gerar resultados inesperados.
Sintaxe de intervalo: A alternativa E usa NOW() + 30, o que não é válido no PostgreSQL — é preciso usar INTERVAL '30 days'. A alternativa D usa DATE_PART('DAY', 30), que retorna o número 30, mas não é uma forma válida de adicionar dias a uma data.
Junção incorreta: A alternativa B faz INNER JOIN parte pt ON pt.idade < 18, o que é uma condição de junção inválida — a condição de junção deve comparar colunas de tabelas diferentes, não filtrar uma tabela. O correto seria usar WHERE pt.idade < 18.
Filtro de data incorreto: A alternativa C usa p.data_audiencia > NOW() + INTERVAL '30 days', que seleciona audiências após 30 dias, não nos próximos 30 dias. O correto seria BETWEEN.
Ordenação incorreta: A alternativa C ordena por ValorCausa ASC (crescente), mas o enunciado pede decrescente.
Alternativa D: Além de usar DATE_PART incorretamente, ela não faz a junção com a tabela ProcessoParte, então não há como garantir que o processo está relacionado à parte.
Alternativa E: Além do intervalo inválido, ela não faz a junção com a tabela ProcessoParte, então não há como garantir que o processo está relacionado à parte.
1Juntar as 3 tabelas
2Filtrar idade < 18
3Filtrar audiência em 30 dias
4Ordenar valor DESC
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
A alternativa A está correta porque:
Faz a junção implícita das três tabelas com as condições corretas no WHERE.
Filtra partes menores de 18 anos com pt.idade < 18.
Filtra audiências nos próximos 30 dias com BETWEEN NOW()::DATE AND NOW()::DATE + INTERVAL '30 days'.
Ordena por valor da causa decrescente com ORDER BY p.valor_causa DESC.
Seleciona as colunas pedidas: processoid, valor_causa e data_audiencia.
Alternativa B — ❌ Incorreta
A alternativa B erra ao usar INNER JOIN parte pt ON pt.idade < 18. A condição de junção deve comparar colunas de tabelas diferentes (ex.: pp.parteid = pt.parteid), não filtrar uma tabela. Além disso, usa SUM(p.valor_causa) e GROUP BY, o que é desnecessário e pode alterar o resultado, pois o enunciado não pede agregação.
Alternativa C — ❌ Incorreta
A alternativa C erra em dois pontos: (1) usa p.data_audiencia > NOW() + INTERVAL '30 days', que seleciona audiências após 30 dias, não nos próximos 30 dias — o correto seria BETWEEN; (2) ordena por ValorCausa ASC (crescente), mas o enunciado pede decrescente (DESC).
Alternativa D — ❌ Incorreta
A alternativa D erra ao usar DATE_PART('DAY', 30), que retorna o número 30, mas não é uma forma válida de adicionar dias a uma data no PostgreSQL. Além disso, não faz a junção com a tabela ProcessoParte, então não há como garantir que o processo está relacionado à parte.
Alternativa E — ❌ Incorreta
A alternativa E erra ao usar NOW() + 30, que não é válido no PostgreSQL — é preciso usar INTERVAL '30 days'. Além disso, não faz a junção com a tabela ProcessoParte, então não há como garantir que o processo está relacionado à parte.
NÃO CAIA NESSA!
A banca explora a confusão entre o operador BETWEEN (que inclui os extremos) e o operador > (que exclui o limite), e entre INTERVAL '30 days' (sintaxe correta no PostgreSQL) e + 30 (inválido). Além disso, tenta induzir ao uso de SUM e GROUP BY quando não há agregação pedida.
PEGA ESSA DICA!
Para resolver questões de SQL, identifique primeiro os requisitos do enunciado (junções, filtros, ordenação, agregação) e depois verifique cada alternativa ponto a ponto. No PostgreSQL, para adicionar dias a uma data, use INTERVAL '30 days'; para intervalos inclusivos, use BETWEEN.