← Questões de Banco de Dados

Banco de Dados · FGV · 2023

Questão comentada de Banco de Dados

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

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.

Continue treinando

Questões relacionadas