Considere o comando SQL a seguir. select * from teste ...
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
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - zero linhas.
Ao trabalharmos com Banco de Dados e SQL, um dos conceitos fundamentais é entender como lidar com valores NULL. Um valor NULL representa a ausência de um valor ou um valor desconhecido na coluna de uma tabela. Na questão em questão, precisamos filtrar os registros baseando-nos na presença ou ausência de valores nulos na coluna nota.
Ao usar a cláusula WHERE para comparar diretamente um valor com NULL usando operadores como <>
, =
, >
, <
, etc., o resultado sempre será desconhecido, porque NULL não é um valor que possa ser comparado diretamente. Em SQL, para verificar se uma coluna é NULL ou não, devemos utilizar as expressões IS NULL ou IS NOT NULL.
No caso desta questão, o filtro where nota <> null
está tentando comparar diretamente a coluna nota com NULL, o que não é válido em SQL. Portanto, todas as linhas, incluindo aquelas com valores não-nulos na coluna nota, não satisfazem a condição e por isso nenhuma linha é retornada, o que explica o porquê da alternativa B ser a resposta correta.
Para retornar as linhas onde a coluna nota não é NULL, o comando correto seria SELECT * FROM teste WHERE nota IS NOT NULL
, que retornaria as 85 linhas com a coluna nota preenchida.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
LETRA B
A construção do jeito que está não funciona, apesar de válida. O correto seria:
IS NULL - Para comparar se os valores são nulos;
IS NOT NULL - Para comparar se os valores NÃO são nulos;
http://sqlfiddle.com/#!9/7cc28d/4
Gabarito : B
Segundo o site da Oracle ( https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm ) neste caso, comparar null como se fosse um valor literal, tem como resultado "UNKNOWN", logo, por isso retorna "zero" linhas.
Veja :
"... To test for nulls, use only the comparison conditions IS NULL and IS NOT NULL. If you use any other condition with nulls and the result depends on the value of the null, then the result is UNKNOWN. "
Operadores relacionais não podem ser utilizados para comparar valores nulos, portanto essa consulta não retornará nenhuma linha.
QUALQUER comparação com NULL que não seja com o operador IS NULL resultará em NULL, e consequentemente fará com que nenhuma linha seja adicionada ao conjunto-resultado.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo