Considere uma tabela chamada Livros com as colunas id (int),...

Próximas questões
Com base no mesmo assunto
Q3952856 Banco de Dados
Considere uma tabela chamada Livros com as colunas id (int), autor (varchar) e ano (int). Sabe-se que alguns livros não são datados, resultando em valores NULL na coluna ano. Considere o seguinte comando SQL:

SELECT * FROM Livros WHERE ano <> 1854; 

Ao ser executado, esse comando retornará
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Gabarito: B

O que precisava saber: Era necessário saber que, em SQL, NULL representa ausência de valor e que comparações com operadores relacionais, como <> , não retornam TRUE quando um dos operandos é NULL, mas UNKNOWN. Também era preciso lembrar que a cláusula WHERE mantém apenas linhas cuja condição seja TRUE.

Critério decisivo: Em SQL, qualquer comparação com NULL resulta em valor lógico desconhecido (UNKNOWN), não verdadeiro; por isso, a cláusula WHERE ano <> 1854 seleciona apenas linhas com ano diferente de 1854 e exclui as linhas em que ano é NULL.

Tema central: SQL relacional: tratamento de NULL em comparações com operador de desigualdade (<>)
Análise das alternativas
A
Errada
Está incorreta porque afirma que os registros com ano NULL seriam incluídos por serem 'diferentes de 1854'. Pela base, NULL não é tratado como valor comparável por <>; a expressão resulta em UNKNOWN, e não em TRUE, de modo que essas linhas não passam no WHERE.
B
Certa
A alternativa B está correta porque descreve exatamente o efeito da condição ano <> 1854 na cláusula WHERE: entram apenas os registros com valor numérico diferente de 1854. As linhas em que ano é NULL ficam de fora, pois a comparação com NULL não resulta em TRUE, mas em UNKNOWN, e o WHERE descarta essas linhas.
C
Errada
Está incorreta porque a base informa que não há erro de sintaxe nessa comparação. Comparar com NULL por meio de operadores relacionais é permitido; o problema não é sintático, e sim lógico: o resultado da comparação é UNKNOWN, não TRUE.
D
Errada
Está incorreta porque atribui ao operador <> um efeito que ele não tem. A condição ano <> 1854 seleciona valores diferentes de 1854; não há fundamento na base para incluir valores iguais a 1854 nem para tratar 0 como caso especial.
E
Errada
Está incorreta porque inverte o sentido da condição. A base é expressa ao dizer que ano <> 1854 inclui apenas registros com ano diferente de 1854, de modo que registros com ano igual a 1854 não satisfazem o filtro.
Pegadinha da questão
A pegadinha é confundir NULL com um valor 'diferente de 1854'. Em SQL padrão, NULL não entra como diferente nem como igual nessa comparação; o resultado é UNKNOWN. Outra confusão comum é esquecer que o WHERE só mantém condições TRUE.
Dica para questões semelhantes
  • Em comparações com =, <>, < ou >, trate NULL como resultado UNKNOWN, não como valor comum.
  • Ao analisar uma cláusula WHERE, verifique se a condição será TRUE; linhas com resultado UNKNOWN são descartadas.
  • Em questões com desigualdade, não suponha que NULL esteja automaticamente incluído entre os 'diferentes'.

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

Horrível!!! Essa consulta não exclui nenhum registro que possui NULL como ano, porque não foi usado COALESCE no where. Quem fez isso claramente não sabe nada de SQL

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo