Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas 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 é:
A0;
B1;
C2;
D3;
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.
1Subconsulta autocorrelacionada
2Compara cada linha consigo mesma
3EXISTS verdadeiro p/ todas
4SQL proíbe modificar tabela referenciada
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.