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
fg165196
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
 

Considerando as tabelas T1 e T2, anteriormente apresentadas, analise o comando SQL a seguir.

 

delete from T2 where P not in (select P from T2)

 

O número de linhas deletadas da tabela T2 pela execução desse comando é:

  1. A0;
  2. B1;
  3. C2;
  4. D3;
  5. E4.
Revelar gabarito e comentário

GabaritoA — 0;

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 DELETE com NOT IN e valores NULL

Gabarito: letra A — o comando delete from T2 where P not in (select P from T2) deleta 0 linhas. A subconsulta retorna todos os valores de P da própria tabela T2, então nenhuma linha tem P fora desse conjunto; e a linha com P = NULL não é excluída porque a comparação NULL not in (...) resulta em UNKNOWN, não em TRUE. A chave está na lógica de três estados do SQL (TRUE, FALSE, UNKNOWN) aplicada a valores NULL.

O comando DELETE remove linhas de uma tabela conforme a condição da cláusula WHERE. Aqui, a condição é P not in (select P from T2). A subconsulta (select P from T2) retorna todos os valores da coluna P da própria tabela T2. Vamos listar esses valores: 2, 3, 8 e NULL. O operador IN verifica se um valor está presente nessa lista; o NOT IN é a negação, ou seja, seleciona linhas cujo valor de P não está na lista.

A tabela T2 tem 4 linhas, com P = 2, 3, 8 e NULL. Para cada linha, a condição P not in (2, 3, 8, NULL) é avaliada:

  • P = 2: 2 está na lista → 2 not in (...) é FALSE → não deleta.

  • P = 3: 3 está na lista → 3 not in (...) é FALSE → não deleta.

  • P = 8: 8 está na lista → 8 not in (...) é FALSE → não deleta.

  • P = NULL: aqui está a pegadinha. A comparação NULL not in (2, 3, 8, NULL) não é TRUE nem FALSE; é UNKNOWN. No SQL, qualquer comparação com NULL (exceto IS NULL e IS NOT NULL) resulta em UNKNOWN. E na cláusula WHERE, apenas as linhas cuja condição é TRUE são selecionadas; UNKNOWN é tratado como não selecionado. Portanto, a linha com P = NULL também não é deletada.

A lógica de três estados é um conceito fundamental em SQL. Diferente da lógica booleana tradicional (TRUE/FALSE), o SQL introduz o valor UNKNOWN para representar o resultado de comparações envolvendo NULL. Isso acontece porque NULL significa "valor desconhecido", e não se pode afirmar se um valor desconhecido é igual ou diferente de outro valor. Por isso, NULL = NULL também resulta em UNKNOWN, e NULL IN (lista) ou NULL NOT IN (lista) resultam em UNKNOWN.

A pegadinha desta questão é justamente a linha com P = NULL. Muitos candidatos podem pensar que, como NULL não está na lista de valores (2, 3, 8), a condição NULL not in (...) seria TRUE, e a linha seria deletada. Mas isso está errado: a comparação com NULL nunca é TRUE ou FALSE, é UNKNOWN, e a linha não é removida. O comando, portanto, não deleta nenhuma linha.

NÃO CAIA NESSA!

A banca explora a lógica de três estados do SQL. O candidato desatento pode achar que NULL not in (2, 3, 8) é TRUE, pois NULL não está na lista. Mas qualquer comparação com NULL (exceto IS NULL/IS NOT NULL) resulta em UNKNOWN, e a linha não é excluída. Lembre-se: NULL não é um valor, é a ausência de valor.

Alternativa A — ✅ Correta ⟵ GABARITO

O comando não deleta nenhuma linha. As três primeiras linhas (P = 2, 3, 8) têm P presente na subconsulta, então P not in (...) é FALSE. A quarta linha (P = NULL) tem a condição avaliada como UNKNOWN, que não é TRUE, então também não é deletada. Resultado: 0 linhas deletadas.

Alternativa B — ❌ Incorreta

Sugere que 1 linha seria deletada, provavelmente a linha com P = NULL. Mas a comparação NULL not in (...) não é TRUE, é UNKNOWN, e a linha não é removida. A condição WHERE só seleciona linhas onde a expressão é TRUE.

Alternativa C — ❌ Incorreta

Sugere que 2 linhas seriam deletadas. Não há nenhuma linha em T2 cujo P não esteja na subconsulta (que retorna os próprios valores de P de T2). As linhas com P = 2, 3 e 8 estão na lista; a linha com NULL não é selecionada por UNKNOWN.

Alternativa D — ❌ Incorreta

Sugere que 3 linhas seriam deletadas. Isso ocorreria se a linha com NULL fosse considerada como "não presente" e deletada, mas a lógica de três estados impede isso. As três linhas com valores não nulos têm P presente na subconsulta, então não são deletadas.

Alternativa E — ❌ Incorreta

Sugere que todas as 4 linhas seriam deletadas. Isso seria verdade se a condição fosse P in (select P from T2) (deletaria todas), mas com NOT IN nenhuma linha atende à condição. A linha com NULL não é deletada por UNKNOWN.

Gabarito: letra A

Link permanente: /questoes/fg165196