Questão de Banco de Dados — SQL — FGV 2024
- Código
- fg075961
- Banca
- FGV
- Órgão
- AL-TO
- Ano
- 2024
- Nível
- Superior
- Cargo
- Analista Legislativo - Desenvolvimento de Sistema
- A

- B

- C

- D

- E






GabaritoB — [imagem]
Esta questão depende de figuras (imagens de equivalências SQL) que não foram transcritas no enunciado. O gabarito oficial é a letra B, mas a explicação abaixo descreve o método de análise sem acesso ao conteúdo visual.
O gabarito é a letra B. A questão pede a alternativa que indica uma equivalência não verdadeira (i.e., uma transformação que altera o resultado da consulta original). Como as alternativas são imagens, vamos revisar o conceito de equivalência lógica em SQL e como identificar transformações inválidas.
Em otimização de consultas, o banco de dados pode reescrever uma consulta SQL em outra forma que produza o mesmo resultado, mas com melhor desempenho. Essas transformações são chamadas de equivalências lógicas. Exemplos comuns incluem:
Comutatividade de junções: a ordem das tabelas em um JOIN pode ser trocada sem alterar o resultado (desde que seja INNER JOIN ou CROSS JOIN, mas com LEFT JOIN a ordem importa).
Associatividade de junções: a forma de agrupar junções (parênteses) pode ser alterada.
Predicate pushdown: aplicar filtros (WHERE) o mais cedo possível, antes das junções, reduz o volume de dados.
Distributividade de operadores: por exemplo, (A ∪ B) ∩ C equivale a (A ∩ C) ∪ (B ∩ C) (distributividade da interseção sobre união).
Eliminação de subconsultas: transformar IN em EXISTS ou JOIN (mas nem sempre é equivalente, pois IN trata NULLs de forma diferente).
Fundir filtros com junções: FROM A JOIN B ON cond1 WHERE cond2 pode ser equivalente a FROM A JOIN B ON cond1 AND cond2 se cond2 se refere apenas a uma tabela.
Ao analisar as figuras, procure por transformações que violem as regras da álgebra relacional ou que dependam de características específicas dos dados (como valores nulos). Exemplos de equivalências não verdadeiras:
Trocar a ordem de LEFT JOIN com filtro na tabela da direita:
```sql
-- Original (correto)
SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.valor > 10;
-- Essa consulta se comporta como INNER JOIN (o filtro elimina NULLs de B).
-- A equivalência falsa seria:
SELECT * FROM (SELECT * FROM A WHERE A.id IN (SELECT id FROM B WHERE valor > 10)) LEFT JOIN B ...
```
Considerar NOT IN equivalente a NOT EXISTS na presença de NULLs:
```sql
SELECT * FROM A WHERE A.id NOT IN (SELECT B.id FROM B);
-- se B.id contém NULL, a subconsulta retorna NULL e o NOT IN nunca é verdadeiro.
-- Já NOT EXISTS funciona corretamente.
```
Aplicar filtro WHERE após junção quando o predicado se refere a colunas da segunda tabela e a junção é um LEFT JOIN: o filtro converte o LEFT JOIN em INNER JOIN.
Considerar que UNION e UNION ALL são equivalentes: UNION elimina duplicatas, UNION ALL não.
Distribuir COUNT sobre união: COUNT(A UNION B) não equivale a COUNT(A) + COUNT(B) porque a união elimina duplicatas entre as duas tabelas.
Sem as imagens, não é possível apontar o erro exato de cada alternativa. O gabarito oficial é a letra B. Na prova, verifique a transformação proposta: ela deve preservar o resultado para qualquer banco de dados, considerando valores nulos, duplicatas e ordem dos operadores. A falsa equivalência geralmente ignora uma dessas nuances.
Dica: Estude as equivalências da álgebra relacional e os casos de pegadinha com NULLs em subconsultas (IN vs EXISTS, NOT IN vs NOT EXISTS). Revise também a semântica dos diferentes tipos de JOIN (left, right, full) quando combinados com filtros.
Gabarito: letra B.
Link permanente: /questoes/fg075961