Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas 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
1
10
2
40
3
20
4
10
Tabela T2
E
Q
P
1
10
2
2
40
3
3
20
8
4
10
NULL
À 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:
Ahaveria um erro de sintaxe na última linha, no termo “flag”;
Bseria produzido um resultado contendo somente a linha de títulos;
Cseria produzido um resultado contendo, além da linha de títulos, uma linha com uma coluna com o valor 0;
Dseria produzido um resultado contendo, além da linha de títulos, uma linha com uma coluna com o valor 1;
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.