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
fg165266
Banca
FGV
Órgão
STN
Ano
2024
Cargo
AFFC ( )
No contexto da lógica de três estados, normalmente utilizada em expressões lógicas que envolvem valores nulos, considere uma tabela relacional T com colunas X, Y, Z, com apenas uma linha, cujos valores das colunas são, respectivamente, 10, 20 e null. Assinale o comando que retornaria o valor 1 no resultado.
  1. Aselect 1 from T where (Z is null or Z = null)
  2. Bselect 1 from T where not Z is null or Y = 15
  3. Cselect 1 from T where not Z is null or Z = null
  4. Dselect 1 from T where Z < X or Z > X
  5. Eselect 1 from T where Z = null or Y <> null
Revelar gabarito e comentário

GabaritoA — select 1 from T where (Z is null or Z = null)

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”.

Lógica de Três Estados e Valores Nulos em SQL

Gabarito: letra A. A única consulta que retorna o valor 1 é aquela cuja condição no WHERE é avaliada como verdadeira (TRUE), e isso só ocorre na alternativa A, pois Z is null é a forma correta de testar nulos em SQL, retornando TRUE para a linha em que Z é NULL. As demais alternativas usam comparações com = ou <> contra NULL, que sempre resultam em UNKNOWN (nem TRUE nem FALSE), fazendo com que a condição seja falsa e nenhuma linha seja retornada.

A lógica de três estados é um conceito fundamental em bancos de dados relacionais para lidar com o valor especial NULL, que representa a ausência de informação. Diferentemente da lógica booleana tradicional, onde uma expressão só pode ser TRUE ou FALSE, a lógica SQL introduz um terceiro estado: UNKNOWN. Isso acontece porque qualquer comparação que envolva um valor NULL não pode ser determinada como verdadeira ou falsa — afinal, se não sabemos o valor, não podemos compará-lo. Por exemplo, a expressão Z = 10 quando Z é NULL não é FALSE, mas sim UNKNOWN, pois não sabemos se o valor desconhecido de Z é igual a 10 ou não.

A regra de ouro para trabalhar com nulos é que comparações com = ou <> contra NULL sempre resultam em UNKNOWN, e por isso nunca retornam linhas em uma cláusula WHERE. Para testar se um valor é nulo, o SQL fornece os operadores específicos IS NULL e IS NOT NULL. O operador IS NULL retorna TRUE se o valor for NULL e FALSE caso contrário, enquanto IS NOT NULL faz o oposto. Essa é a única maneira correta de verificar a presença ou ausência de um valor nulo.

A tabela verdade da lógica de três estados é essencial para entender como as expressões compostas se comportam. No caso do operador OR, o resultado é TRUE se pelo menos um dos operandos for TRUE; se ambos forem FALSE, o resultado é FALSE; e se nenhum for TRUE mas pelo menos um for UNKNOWN, o resultado é UNKNOWN. Já o operador NOT simplesmente inverte o valor: NOT TRUE é FALSE, NOT FALSE é TRUE, e NOT UNKNOWN é UNKNOWN. Essas regras são cruciais para avaliar as condições das alternativas.

A pegadinha clássica que a banca explora é a tentação de usar = NULL ou <> NULL por analogia com outros operadores de comparação. O candidato que não domina a lógica de três estados pode achar que Z = null deveria retornar TRUE quando Z é nulo, mas na verdade retorna UNKNOWN, que é tratado como falso na avaliação do WHERE. Da mesma forma, Y <> null também retorna UNKNOWN, independentemente do valor de Y. A única forma de testar nulos é com IS NULL ou IS NOT NULL.

Guarde essa distinção fundamental: = NULL e <> NULL sempre resultam em UNKNOWN; IS NULL e IS NOT NULL são os operadores corretos para testar nulos. É exatamente nessa fronteira que as alternativas se dividem.

Alternativa A — ✅ Correta ⟵ GABARITO

A condição (Z is null or Z = null) é avaliada da seguinte forma: Z is null retorna TRUE, pois Z é NULL. O segundo termo, Z = null, retorna UNKNOWN. Na lógica de três estados, TRUE OR UNKNOWN resulta em TRUE. Portanto, a condição do WHERE é verdadeira, e a consulta retorna a linha, exibindo o valor 1. Esta é a única alternativa que utiliza corretamente o operador IS NULL para testar a nulidade.

Alternativa B — ❌ Incorreta

A condição not Z is null or Y = 15 é avaliada como: not Z is null é NOT TRUE, que resulta em FALSE. O segundo termo, Y = 15, é FALSE, pois Y é 20. Como FALSE OR FALSE é FALSE, a condição é falsa e nenhuma linha é retornada. O erro aqui é usar not Z is null em vez de Z is not null — embora ambos sejam equivalentes, a expressão not Z is null é avaliada como NOT (Z IS NULL), que é FALSE para a linha em questão, tornando a condição geral falsa.

Alternativa C — ❌ Incorreta

A condição not Z is null or Z = null é avaliada como: not Z is null é FALSE (como visto na alternativa B). O segundo termo, Z = null, é UNKNOWN. Na lógica de três estados, FALSE OR UNKNOWN resulta em UNKNOWN, que é tratado como falso na avaliação do WHERE. Portanto, nenhuma linha é retornada. O erro é combinar um teste correto (not Z is null) com uma comparação inválida (Z = null), que sempre resulta em UNKNOWN.

Alternativa D — ❌ Incorreta

A condição Z < X or Z > X é avaliada como: Z < X é UNKNOWN, pois Z é NULL. Da mesma forma, Z > X também é UNKNOWN. Na lógica de três estados, UNKNOWN OR UNKNOWN resulta em UNKNOWN, que é tratado como falso. Portanto, nenhuma linha é retornada. O erro é usar operadores de comparação (<, >) com um valor nulo, o que sempre resulta em UNKNOWN.

Alternativa E — ❌ Incorreta

A condição Z = null or Y <> null é avaliada como: Z = null é UNKNOWN. O segundo termo, Y <> null, também é UNKNOWN, pois Y é 20 (não nulo), mas a comparação com NULL usando <> sempre resulta em UNKNOWN. Na lógica de três estados, UNKNOWN OR UNKNOWN resulta em UNKNOWN, que é tratado como falso. Portanto, nenhuma linha é retornada. O erro é usar = null e <> null em vez dos operadores corretos IS NULL e IS NOT NULL.

A regra que você leva para a prova é simples e poderosa: nunca compare com NULL usando =, <>, <, >; use sempre IS NULL ou IS NOT NULL. Qualquer outra comparação com nulo resulta em UNKNOWN, que é tratado como falso na cláusula WHERE, fazendo com que a consulta não retorne linhas.

Gabarito: letra A

Link permanente: /questoes/fg165266