Gerenciadores de bancos de dados relacionais usualmente emp...

Próximas questões
Com base no mesmo assunto
Q2287687 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
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: B - todas as linhas de T que contêm valores não nulos na coluna A serão excluídas.

Para compreender a questão, é necessário abordarmos dois tópicos principais: o funcionamento do comando DELETE em SQL e a lógica de três estados quando se trata de valores nulos (NULL) em operações de comparação em bancos de dados relacionais.

O comando DELETE é utilizado para remover linhas de uma tabela que atendem a uma condição especificada. No comando SQL apresentado, a cláusula WHERE EXISTS verifica a existência de uma condição verdadeira. A subconsulta (subquery) especificada dentro do EXISTS faz uma busca na mesma tabela T (uma autorreferência) e compara os valores da coluna A com eles mesmos, através da condição T.A = T2.A.

Quando a coluna A possui um valor não nulo, a comparação T.A = T2.A será verdadeira, pois cada linha irá se encontrar na comparação com ela mesma. Contudo, quando a coluna A possui um valor nulo, a lógica de três estados entra em ação. Em SQL, uma comparação de um valor nulo com qualquer outro valor, incluindo outro nulo, não resulta em verdadeiro, mas sim em desconhecido. Portanto, a condição T.A = T2.A não será satisfeita quando A for nulo.

Consequentemente, a alternativa correta é a letra B, já que apenas as linhas com valores não nulos na coluna A serão excluídas. Isso ocorre porque para cada linha não nula na coluna A existe pelo menos um correspondente - ela própria - que satisfaz a condição da subconsulta. Por outro lado, linhas com valores nulos na coluna A não serão excluídas, pois a comparação com nulo não resulta em verdadeiro na lógica de três estados do SQL.

É importante notar que a questão afirma que o comando SQL é sintaticamente válido, descartando a alternativa E que sugere um erro de sintaxe pela autorreferência na cláusula EXISTS, o que não é uma restrição em SQL.

Resumindo: A exclusão ocorrerá para todas as linhas que atendem à condição especificada na cláusula WHERE com a subconsulta EXISTS, ou seja, para todas as linhas que têm um valor não nulo na coluna A, já que a comparação de valores não nulos é verdadeira, e as subconsultas encontram correspondência para essas linhas.

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

A alternativa correta é a B . Todas as linhas de T que contêm valores não nulos na coluna A serão excluídas.

O comando SQL delete from T where exists (select * from T T2 where T.A=T2.A) irá excluir todas as linhas da tabela T onde existe uma linha na mesma tabela (T2 é um alias para T) com o mesmo valor na coluna A. Isso significa que todas as linhas com valores não nulos na coluna A que correspondem a pelo menos uma outra linha na tabela serão excluídas.

As operações de comparação com NULL em SQL são tratadas de forma especial. Se a coluna A contiver um valor NULL, a condição T.A=T2.A não será verdadeira, nem falsa, mas desconhecida. Portanto, as linhas com NULL na coluna A não serão afetadas pelo comando DELETE.

As outras alternativas estão incorretas pelas seguintes razões:

A : Algumas linhas de T serão excluídas - aquelas que têm um valor não nulo na coluna A que corresponde a pelo menos uma outra linha na tabela.

C : As linhas de T que contêm valores nulos na coluna A não serão excluídas, porque a comparação com NULL resulta em um valor desconhecido, não verdadeiro.

D : Nem todas as linhas de T serão excluídas. As linhas com NULL na coluna A ou aquelas cujo valor na coluna A não corresponde a nenhuma outra linha na tabela não serão excluídas.

E : A sintaxe do SQL permite a autorreferência na cláusula EXISTS. O comando fornecido é válido e executará como descrito acima.

(Usando o Bing)

Atenção!

Há uma questão praticamente idêntica a esta da própria FGV (), a qual a Banco adotou outro entendimento.

A questão aborda a característica do SGBD relacionada à possibilidade de autorreferência na cláusula exists nas operações de UPDATE e DELETE.

Quanto aos 4 grandes SGBDs, temos:

  • PostgreSQL ✅
  • MSSQL Server ✅
  • Oracle Database ✅
  • Oracle MySQL ❌

Na questão , a FGV adotou o entendimento do MySQL.

Gabarito A

GAB. B

O comando SQL dado está tentando excluir algumas linhas de uma tabela T com base em outra tabela T2. Ele faz isso olhando para a coluna chamada A nas duas tabelas e verifica se os valores são iguais. Se eles forem iguais, a linha na tabela T será excluída.

A questão envolve a lógica de como lidar com valores nulos (que representam a falta de um valor) em SQL.

Em SQL, quando você faz uma comparação envolvendo valores nulos, o resultado pode ser "desconhecido."

A alternativa correta (B) diz que apenas as linhas da tabela T que possuem valores não nulos na coluna A serão excluídas. Se uma linha tiver um valor nulo na coluna A, essa linha não será excluída. Portanto, somente as linhas com valores não nulos na coluna A serão afetadas pela exclusão, enquanto as linhas com valores nulos na coluna A permanecerão na tabela T.

Clique para visualizar este comentário

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