Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
fg165195
Banca
FGV
Órgão
CGE PB
Ano
2024
Cargo
ACP ( )

Tabelas Relacionais T1 e T2

 

Considere as tabelas relacionais T1 e T2, de acordo com as colunas e as instâncias abaixo descritas. Na execução dos comandos SQL, assuma que o mecanismo do banco de dados considera valores NULL como valores desconhecidos (unknown).

 

Tabela T1

 
P

N

110
240
320
410
 

Tabela T2

 

E

QP
1102
2403
3208
410NULL
 

À luz das tabelas T1 e T2, anteriormente apresentadas, analise o comando SQL exibido a seguir.

 

select case when

           exists (select * from T2

                      where T2.E = 2

                          and T2.P = 3

                          and exists

                              (select * from T1

                               where T1.P in (2,3,4)

                                    and T2.E in (2,3)))

                     then 1 else 0 end flag

 

Sobre uma eventual execução desse script, é correto afirmar que:

  1. Ahaveria um erro de sintaxe na última linha, no termo “flag”;
  2. Bseria produzido um resultado contendo somente a linha de títulos;
  3. Cseria produzido um resultado contendo, além da linha de títulos, uma linha com uma coluna com o valor 0;
  4. Dseria produzido um resultado contendo, além da linha de títulos, uma linha com uma coluna com o valor 1;
  5. Ehaveria um erro de sintaxe na segunda linha, pois não é permitido o uso da cláusula “exists” logo após o termo “when”.
Revelar gabarito e comentário

GabaritoD — seria produzido um resultado contendo, além da linha de títulos, uma linha com uma coluna com o valor 1;

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”.

Comando SELECT com CASE e EXISTS aninhado

Gabarito: letra D — o script é sintaticamente válido e produz uma linha com o valor 1. A subconsulta mais interna encontra a linha de T2 com E=2 e P=3, e a condição T1.P in (2,3,4) é satisfeita, tornando o EXISTS verdadeiro e o CASE retorna 1. Não há erro de sintaxe em flag nem no uso de EXISTS após WHEN.

O comando apresentado é um SELECT que usa a estrutura CASE WHEN ... THEN ... ELSE ... END para retornar um valor condicional. A expressão CASE avalia uma condição e, se verdadeira, retorna o valor após THEN; caso contrário, retorna o valor após ELSE. Aqui, a condição é a existência de registros em uma subconsulta correlacionada que envolve as tabelas T2 e T1.

Vamos decompor a consulta passo a passo. A subconsulta mais externa é:

select * from T2 
where T2.E = 2 
and T2.P = 3 
and exists (select * from T1 where T1.P in (2,3,4) and T2.E in (2,3))

Ela procura linhas em T2 onde E = 2 e P = 3. Na tabela T2 fornecida, a linha com E = 2 tem P = 3, então essa condição é satisfeita. Além disso, a subconsulta mais interna verifica se existe alguma linha em T1 onde T1.P está no conjunto (2,3,4) e T2.E está no conjunto (2,3). Como T2.E = 2 (da linha atual), a condição T2.E in (2,3) é verdadeira. E na tabela T1, existem linhas com P = 2, P = 3 e P = 4, então T1.P in (2,3,4) também é verdadeiro. Portanto, a subconsulta mais interna retorna linhas, o EXISTS é verdadeiro, e a subconsulta externa retorna a linha de T2. Assim, o EXISTS mais externo é verdadeiro, e o CASE retorna 1.

O comando SELECT sem FROM é válido em muitos bancos de dados (como Oracle, PostgreSQL, SQL Server) e retorna uma única linha com a coluna flag. O alias flag é permitido e não causa erro de sintaxe. A alternativa E sugere que EXISTS não pode ser usado após WHEN, mas isso é incorreto — EXISTS é uma expressão booleana válida em qualquer contexto onde uma condição é esperada, incluindo CASE WHEN.

Alternativa A — ❌ Incorreta

A alternativa afirma que haveria erro de sintaxe na última linha, no termo “flag”. Isso é falso: flag é um alias válido para a coluna resultante do CASE. Em SQL, um alias pode ser qualquer identificador válido, e flag é um nome comum e permitido. Não há erro de sintaxe nesse termo.

Alternativa B — ❌ Incorreta

A alternativa afirma que o resultado conteria somente a linha de títulos. Isso seria verdadeiro se a consulta não retornasse nenhuma linha, mas como o CASE retorna 1, há uma linha de dados. A consulta SELECT sem FROM sempre retorna uma linha (em bancos que suportam essa sintaxe), então o resultado tem a linha de títulos e uma linha com o valor 1.

Alternativa C — ❌ Incorreta

A alternativa afirma que o resultado conteria uma linha com o valor 0. Isso ocorreria se o EXISTS fosse falso, mas como demonstrado, o EXISTS é verdadeiro, então o CASE retorna 1, não 0. A alternativa C descreve o resultado que seria obtido se a condição não fosse satisfeita, o que não é o caso.

Alternativa D — ✅ Correta ⟵ GABARITO

A alternativa D afirma que o resultado conteria, além da linha de títulos, uma linha com uma coluna com o valor 1. Isso está correto: o EXISTS é verdadeiro, o CASE retorna 1, e a consulta produz uma linha com a coluna flag de valor 1. A linha de títulos é o cabeçalho da coluna flag.

Alternativa E — ❌ Incorreta

A alternativa afirma que haveria erro de sintaxe na segunda linha, pois não é permitido o uso da cláusula EXISTS logo após o termo when. Isso é falso: EXISTS é uma expressão booleana válida em qualquer contexto onde uma condição é esperada, incluindo CASE WHEN. A sintaxe CASE WHEN EXISTS (subconsulta) THEN ... é perfeitamente válida em SQL padrão e na maioria dos bancos de dados.

PEGA ESSA DICA!

Para resolver questões com EXISTS aninhado, avalie a subconsulta mais interna primeiro e vá subindo. Verifique se as condições são satisfeitas com os dados fornecidos. Lembre-se de que EXISTS retorna verdadeiro se a subconsulta retornar pelo menos uma linha, e falso caso contrário. Aqui, a linha de T2 com E=2 e P=3 existe, e a subconsulta interna encontra linhas em T1 com P em (2,3,4), então o resultado é 1.

Gabarito: letra D

Link permanente: /questoes/fg165195