Pular para o conteúdo principal

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

Banco de DadosConsultas 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:
  1. 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
  2. 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
  3. 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
  4. 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)
  5. 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.

  1. 1Juntar as 3 tabelas
  2. 2Filtrar idade < 18
  3. 3Filtrar audiência em 30 dias
  4. 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.

Gabarito: letra A

Link permanente: /questoes/fg169072