Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas 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
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
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 é:
A0;
B1;
C2;
D3;
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.