Pular para o conteúdo principal

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

Banco de DadosConsultas 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.

ABC
1020

31

10NULL

32

1120

NULL

129

31

148

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 é:

  1. Aa primeira e a terceira;
  2. Ba segunda e a quarta;
  3. Ca terceira e a quinta;
  4. Da primeira, a segunda e a quarta;
  5. 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 é.

Gabarito: letra D

Link permanente: /questoes/fg161111