Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023

Banco de DadosConsultas e Comandos em SQL
Código
fg161099
Banca
FGV
Órgão
Pref Niterói
Ano
2023
Cargo
Ana ( )

Figura 1

Nas duas questões a seguir, considere a tabela relacional T cuja instância é exibida abaixo.

 

A instalação está configurada para o tratamento de valores NULL como valores desconhecidos (unknown).

 

Tabela T

A B C
3 6 10
1 NULL 10
3 6 NULL
3 6 5
 

Considerando a tabela T da figura 1, analise o comando a seguir.

 

DELETE FROM T
WHERE EXISTS ( SELECT * FROM T t2
                              WHERE T.A = t2.A
                              and T.B = t2.B
                              and T.C = t2.C )

O número de linhas removidas pela execução do comando acima é:

  1. A0;
  2. B1;
  3. C2;
  4. D3;
  5. E4.
Revelar gabarito e comentário

GabaritoA — 0;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Comando DELETE com EXISTS e valores NULL

Gabarito: letra A. O comando DELETE remove 0 linhas porque a subconsulta com EXISTS compara cada linha da tabela T com todas as linhas dela mesma (incluindo a própria linha), e a condição T.A = t2.A AND T.B = t2.B AND T.C = t2.C é sempre verdadeira para a própria linha, fazendo com que todas as linhas sejam candidatas à exclusão. No entanto, a instrução é rejeitada pelo SGBD porque a subconsulta referencia a mesma tabela que está sendo modificada pelo DELETE, o que não é permitido no SQL padrão. Portanto, nenhuma linha é removida.

O comando DELETE com EXISTS é uma forma de remover linhas de uma tabela com base na existência de correspondências em uma subconsulta. A subconsulta SELECT * FROM T t2 WHERE T.A = t2.A AND T.B = t2.B AND T.C = t2.C é uma autocorrelação: para cada linha da tabela T (referenciada como T no comando externo), a subconsulta verifica se existe alguma linha t2 (que é a mesma tabela T, apenas com um alias diferente) que tenha os mesmos valores em todas as três colunas. Como cada linha sempre corresponde a si mesma, a condição é verdadeira para todas as linhas, e o EXISTS retorna verdadeiro para todas elas. Isso significa que, se o comando fosse executado, todas as 4 linhas seriam removidas.

No entanto, há uma restrição fundamental no SQL: não é permitido modificar uma tabela (com DELETE, UPDATE ou INSERT) enquanto a mesma tabela é referenciada na subconsulta do comando. Essa regra existe para evitar ambiguidades e inconsistências durante a operação. O SQL padrão e a maioria dos SGBDs (como PostgreSQL, MySQL, Oracle) rejeitam esse tipo de comando com um erro. Portanto, a execução do comando falha e nenhuma linha é removida.

É importante notar que, mesmo que a restrição de não referenciar a mesma tabela não existisse, a presença de valores NULL na tabela não afetaria o resultado, pois a comparação T.B = t2.B com NULL resultaria em UNKNOWN, e o EXISTS consideraria isso como falso. Mas, como a linha se compara a si mesma, a condição seria verdadeira para as linhas sem NULL e falsa para as linhas com NULL. No entanto, a restrição de não referenciar a mesma tabela é o fator decisivo aqui.

A pegadinha desta questão está em o candidato focar na análise dos valores NULL e na lógica de três estados, tentando contar quantas linhas seriam removidas, quando na verdade o comando é inválido e não remove nenhuma linha. A banca explora o conhecimento da restrição de não modificar uma tabela referenciada na subconsulta.

  1. 1Subconsulta autocorrelacionada
  2. 2Compara cada linha consigo mesma
  3. 3EXISTS verdadeiro p/ todas
  4. 4SQL proíbe modificar tabela referenciada
  5. 5[-] Comando rejeitado — 0 linhas
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa A está correta porque o comando DELETE é rejeitado pelo SGBD, pois a subconsulta referencia a mesma tabela T que está sendo modificada. Essa restrição é uma regra do SQL padrão e é implementada pela maioria dos bancos de dados. Portanto, nenhuma linha é removida, e o número de linhas removidas é 0.

Alternativa B — ❌ Incorreta

A alternativa B sugere que 1 linha seria removida. Isso não ocorre porque o comando é inválido e não executa. Mesmo que a restrição não existisse, a análise da subconsulta mostraria que todas as linhas seriam candidatas, não apenas uma.

Alternativa C — ❌ Incorreta

A alternativa C sugere que 2 linhas seriam removidas. Isso não ocorre porque o comando é inválido. Além disso, a presença de NULL na coluna B da segunda linha e na coluna C da terceira linha faria com que essas linhas não fossem removidas, mas as outras duas seriam, totalizando 2. No entanto, a restrição de não referenciar a mesma tabela impede a execução.

Alternativa D — ❌ Incorreta

A alternativa D sugere que 3 linhas seriam removidas. Isso não ocorre porque o comando é inválido. A análise da subconsulta mostraria que as linhas com valores não nulos seriam removidas, mas a restrição impede a execução.

Alternativa E — ❌ Incorreta

A alternativa E sugere que 4 linhas seriam removidas. Isso não ocorre porque o comando é inválido. Mesmo que a restrição não existisse, a linha com NULL na coluna B e a linha com NULL na coluna C não seriam removidas, pois a comparação com NULL resulta em UNKNOWN, e o EXISTS consideraria falso. Portanto, apenas 2 linhas seriam removidas, não 4.

Gabarito: letra A

Link permanente: /questoes/fg161099