Os principais Sistemas Gerenciadores de Bancos de Dados oferecem total suporte à linguagem SQL. Um aspecto importante da implementação do SQL é o tratamento para valores nulos quando esses são considerados como unknown values. Nesse contexto, considere uma tabela T com colunas A e B, que podem conter valores nulos. T possui 100 registros e, em 50% das linhas, há pelo menos uma coluna preenchida com o valor NULL. Considere a consulta a seguir: SELECT * FROM T t1 WHERE t1.A = NULL or t1.B = NULL O número máximo de linhas de resultados que seriam retornadas pela consulta é igual a
- A)0.
Correta, porque comparacao com NULL usando = gera UNKNOWN e o WHERE elimina todas as linhas.
- B)25.
Errada, pois o enunciado nao pede linhas com pelo menos um NULL, e sim usa uma comparacao invalida com NULL.
- C)50.
Errada, porque metade da tabela ter NULL nao significa que a consulta com = NULL va retornar essas 50 linhas.
- D)75.
Errada, ja que a quantidade de registros com NULL nao altera o fato de a expressao ser sempre desconhecida.
- E)100.
Errada, pois mesmo havendo 100 registros, a condicao WHERE nao fica verdadeira para nenhuma linha.
Gabarito: A
Em SQL, NULL nao significa zero, string vazia ou “campo em branco”: ele representa um valor desconhecido ou inexistente. Por isso, comparacoes do tipo = NULL nao funcionam como muita gente imagina. Quando voce escreve t1.A = NULL ou t1.B = NULL, o resultado nao e verdadeiro nem falso, e sim desconhecido (UNKNOWN). E, no WHERE, so passam as linhas em que a condicao e verdadeira. Se a condicao nao e verdadeira, a linha fica de fora. Na pratica, isso derruba a consulta inteira. Mesmo que a tabela tenha varias linhas com valores nulos, a expressao usada no enunciado esta errada para testar NULL. O jeito correto e usar IS NULL ou IS NOT NULL, porque SQL trata NULL de forma especial. Esse comportamento decorre da logica ternaria do SQL, prevista no padrao da linguagem e adotada pelos principais SGBDs. Assim, a consulta SELECT * FROM T t1 WHERE t1.A = NULL or t1.B = NULL nao retorna nenhuma linha. Como ambas as comparacoes sao desconhecidas, o OR tambem nao chega a verdadeiro. Logo, o numero maximo de linhas de resultado e 0, que corresponde ao gabarito A.