Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas e Comandos em SQL
Código
fg161111
Banca
FGV
Órgão
DPE RS
Ano
2023
Cargo
Ana ( )
Tabela R1
Na questão a seguir, considere a tabela R1, cuja instância é exibida a seguir.
A
B
C
10
20
31
10
NULL
32
11
20
NULL
12
9
31
14
8
NULL
Com referência à tabela R1, como descrita anteriormente, analise o comando SQL a seguir.
update R1
set B=0
where C in (31,32) or C = null
O conjunto completo de linhas afetadas pela execução desse comando é:
Aa primeira e a terceira;
Ba segunda e a quarta;
Ca terceira e a quinta;
Da primeira, a segunda e a quarta;
Ea segunda, a terceira e a quinta.
Revelar gabarito e comentário▾
GabaritoD — a primeira, a segunda e a quarta;
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”.
SQL: Tratamento de NULL e a lógica de três valores
Gabarito: letra D. O comando UPDATE afeta as linhas cujo valor de C seja 31 ou 32, pois a condição C = NULL nunca é verdadeira — em SQL, qualquer comparação com NULL resulta em UNKNOWN, não em TRUE ou FALSE. Assim, apenas as linhas 1, 2 e 4 (com C igual a 31, 32 e 31, respectivamente) são atualizadas, tornando a letra D a resposta correta.
O ponto central desta questão é entender como o SQL lida com valores nulos. NULL não é um valor, mas a ausência de valor. Por isso, operadores de comparação como =, >, < não funcionam com NULL da forma intuitiva. Quando você escreve C = NULL, o banco de dados não compara o conteúdo da coluna com o valor NULL; ele avalia a expressão como UNKNOWN, que é um terceiro estado lógico além de TRUE e FALSE. Como a cláusula WHERE só seleciona linhas onde a condição é TRUE, a condição C = NULL nunca seleciona nenhuma linha.
Para verificar se um valor é nulo, o SQL oferece o operador IS NULL (e IS NOT NULL). A expressão C IS NULL retorna TRUE apenas para linhas onde C é efetivamente nulo. No comando da questão, a condição C = NULL é um erro clássico de programação, e a banca explora exatamente essa confusão.
Vamos analisar a tabela R1 linha por linha:
Linha
A
B
C
C é 31 ou 32?
C é NULL?
Atualizada?
1
10
20
31
Sim
Não
Sim
2
10
NULL
32
Sim
Não
Sim
3
11
20
NULL
Não
Sim (mas C = NULL é UNKNOWN)
Não
4
12
9
31
Sim
Não
Sim
5
14
8
NULL
Não
Sim (mas C = NULL é UNKNOWN)
Não
A condição C in (31,32) or C = null é avaliada como TRUE apenas quando C é 31 ou 32. Para as linhas 3 e 5, C é NULL, e a expressão C = NULL resulta em UNKNOWN, que não é TRUE. Portanto, essas linhas não são atualizadas. O comando UPDATE afeta exatamente as linhas 1, 2 e 4.
NÃO CAIA NESSA!
A banca adora trocar C = NULL por C IS NULL. A primeira nunca é verdadeira, enquanto a segunda é a forma correta de verificar nulos. Lembre-se: NULL não é um valor, é a ausência dele — qualquer comparação com = resulta em UNKNOWN, e o WHERE só considera TRUE.
NÃO CAIA NESSA!
Na prova, ao ver = NULL em uma condição, marque mentalmente como "nunca seleciona". Para testar nulos, use IS NULL ou IS NOT NULL. Essa é uma pegadinha recorrente em questões de SQL.
Alternativa A — ❌ Incorreta
Afirma que apenas a primeira e a terceira linhas são afetadas. Isso está errado porque a terceira linha tem C = NULL, e a condição C = NULL não é verdadeira. Além disso, a segunda linha (com C = 32) também deveria ser atualizada, mas não está incluída. A alternativa ignora a linha 2 e inclui erroneamente a linha 3.
Alternativa B — ❌ Incorreta
Afirma que apenas a segunda e a quarta linhas são afetadas. Isso está errado porque a primeira linha (com C = 31) também deveria ser atualizada, mas não está incluída. A alternativa ignora a linha 1, que atende à condição C in (31,32).
Alternativa C — ❌ Incorreta
Afirma que apenas a terceira e a quinta linhas são afetadas. Isso está errado porque ambas têm C = NULL, e a condição C = NULL não é verdadeira. Nenhuma dessas linhas deveria ser atualizada. A alternativa inverte completamente o resultado, selecionando exatamente as linhas que não são afetadas.
Alternativa D — ✅ Correta ⟵ GABARITO
Afirma que a primeira, a segunda e a quarta linhas são afetadas. Isso está correto porque essas linhas têm C igual a 31, 32 e 31, respectivamente, atendendo à condição C in (31,32). As linhas 3 e 5, com C = NULL, não são afetadas porque C = NULL resulta em UNKNOWN. Portanto, a letra D é a resposta correta.
Alternativa E — ❌ Incorreta
Afirma que a segunda, a terceira e a quinta linhas são afetadas. Isso está errado porque a terceira e a quinta linhas têm C = NULL, e a condição C = NULL não é verdadeira. Além disso, a primeira linha (com C = 31) deveria ser atualizada, mas não está incluída. A alternativa inclui linhas que não são afetadas e omite uma que é.