Considere que a tabela relacional T: (1) contém 100 linhas na sua instância corrente; (2) possui uma coluna A que é uma chave primária e não aceita nulos; e (3) a configuração do ambiente de consultas SQL trata valores nulos (NULL) como unknown. Nesse contexto, assinale os números mínimos e máximos, respectivamente, de linhas que seriam produzidas pela execução do comando SELECT * FROM T WHERE A = NULL UNION SELECT * FROM T WHERE A <> NULL
- A)0 e 0.
Correta, porque ambas as comparações com NULL resultam em unknown e nenhuma linha é selecionada, logo o UNION também produz 0 linhas.
- B)0 e 1.
Errada, porque não existe cenário em que a consulta produza 1 linha com essas comparações; o resultado fica vazio.
- C)1 e 1.
Errada, porque a tabela ter 100 linhas não significa que a consulta retornará 1 linha, já que NULL invalida o predicado.
- D)0 e 100.
Errada, porque nenhuma das duas partes do UNION pode retornar 100 linhas com A = NULL ou A <> NULL.
- E)1 e 100.
Errada, porque a presença de 100 linhas na tabela não gera automaticamente 1 linha de resultado em consultas com comparações inválidas com NULL.
Gabarito: A
Em SQL, quando o ambiente trata NULL como unknown, comparações como = NULL e <> NULL não funcionam do jeito intuitivo. Isso acontece porque NULL não representa um valor concreto, e sim a ausência de valor. Então, ao comparar qualquer coisa com NULL usando operadores relacionais, o resultado tende a ser unknown, e desconhecido em um WHERE não passa no filtro. Nesta questão, a tabela T tem 100 linhas, mas isso não muda o resultado final. A primeira consulta, SELECT * FROM T WHERE A = NULL, não retorna linhas, porque A é chave primária e não aceita nulos, além de a comparação com NULL produzir unknown. A segunda, SELECT * FROM T WHERE A <> NULL, também não retorna linhas pelo mesmo motivo. Como as duas subconsultas produzem conjuntos vazios, o UNION entre elas continua vazio. O UNION elimina duplicidades, mas aqui nem há o que unir. Portanto, o número mínimo e o máximo de linhas produzidas é 0 e 0. Em termos de regra prática de prova: nunca compare NULL com = ou <> para esperar um resultado verdadeiro. Em SQL, o caminho correto para testar nulos é IS NULL ou IS NOT NULL, algo muito explorado em questões de banca, inclusive pela FGV.