Questão nº 66
Questão de Administração de Banco de Dados · FGV MPAL 2018 (nº 66)
Considere o comando SQL a seguir.
select ``
from teste
where nota <> null
Sabendo-se que a tabela teste tem 100 registros, dos quais 15 estão com a coluna nota ainda não preenchida (null*), o comando acima, executado no MS SQL Server ou no Oracle, retorna
- Aum erro, porque o literal null não pode ser usado diretamente numa comparação.
- Bzero linhas. (alternativa correta)
- Cquinze linhas.
- Doitenta e cinco linhas.
- Ecem linhas.
Resposta comentada
Gabarito Alternativa B
Em SQL, `NULL` não é um valor, mas a ausência de um valor ou um valor desconhecido. Por isso, comparações diretas com `NULL` (como `=`, `<>`, `>`, `<`) não resultam em `TRUE` ou `FALSE`, mas sim em `UNKNOWN`.
(A) Incorreta: Não é um erro sintático. O comando é válido e será executado, mas o resultado lógico da comparação é `UNKNOWN`.
(B) Correta: O SQL utiliza uma lógica de três valores (`TRUE`, `FALSE`, `UNKNOWN`). A cláusula `WHERE` só retorna registros para os quais a condição avalia como `TRUE`. Como qualquer comparação direta com `NULL` (incluindo `nota <> NULL`) resulta em `UNKNOWN`, e `UNKNOWN` não é `TRUE`, nenhuma linha é retornada.
(C) Incorreta: Quinze linhas seriam retornadas se a condição fosse `nota IS NULL`, mas `nota <> NULL` não avalia como `TRUE` para os registros com `NULL`.
(D) Incorreta: Esta é a armadilha. O distrator tenta fazer o aluno pensar que `nota <> NULL` significa "nota não é nula", o que retornaria os 85 registros preenchidos. No entanto, em SQL, para verificar se um valor não é nulo, usa-se `nota IS NOT NULL`. A comparação `nota <> NULL` sempre resulta em `UNKNOWN`, não em `TRUE`.
(E) Incorreta: Cem linhas seriam retornadas se a condição fosse sempre `TRUE` para todos os registros, o que não é o caso aqui.
Fonte: FGV MPAL 2018 Analista do Ministério Público - Administrador de Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.