Gerenciadores de bancos de dados relacionais usualmente empregam a lógica de três estados quando há operações de comparação envolvendo valores nulos (NULL). Nesse contexto, considere o comando SQL a seguir. delete from T where exists (select * from T T2 where T.A=T2.A) Nesse contexto, é correto afirmar que
- A)nenhuma linha de T será excluída, independentemente do conteúdo da coluna A.
Errada, porque as linhas com A não nulo satisfazem a subconsulta e fazem o EXISTS ser verdadeiro.
- B)todas as linhas de T que contêm valores não nulos na coluna A serão excluídas.
Certa, pois para valores não nulos a comparação A = T2.A encontra a própria linha e autoriza a exclusão.
- C)todas as linhas de T que contêm valores nulos na coluna A serão excluídas.
Errada, porque linhas com NULL não passam na comparação e, portanto, não são selecionadas pelo EXISTS.
- D)todas as linhas de T serão excluídas, independentemente do conteúdo da coluna A.
Errada, pois as linhas com NULL não fazem a condição da subconsulta ser verdadeira e escapam do delete.
- E)o comando contém um erro, pois o a sintaxe do SQL não permite a autorreferência na cláusula exists.
Errada, porque SQL permite subconsulta correlacionada com autorreferência na cláusula EXISTS sem problema de sintaxe.
Gabarito: B
Em SQL, a cláusula EXISTS não se preocupa com o valor retornado pela subconsulta, e sim com uma coisa simples: existe ao menos uma linha que satisfaça a condição? Se existir, o resultado é verdadeiro. Se não existir, é falso. Parece banal, mas aí mora a pegadinha com o NULL, porque comparação com NULL não dá verdadeiro nem falso, dá desconhecido na lógica de três estados. No comando dado, a subconsulta olha a própria tabela T e compara T.A com T2.A. Para uma linha em que A não é nulo, ela sempre encontra pelo menos ela mesma, pois A = A é verdadeiro. Então o EXISTS fica verdadeiro e a linha é marcada para exclusão. Já quando A é NULL, a expressão NULL = NULL não é verdadeira, ela é desconhecida. Como não sobra nenhuma linha que faça a condição do WHERE da subconsulta virar verdadeira, o EXISTS fica falso. Resultado: as linhas com NULL não entram no delete. Por isso o gabarito é B: serão excluídas todas as linhas de T que têm valor não nulo em A. E não, a autorreferência na subconsulta não é erro de sintaxe; isso é perfeitamente permitido em SQL.