Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas e Comandos em SQL
Código
fg161104
Banca
FGV
Órgão
TJ RN
Ano
2023
Cargo
AJ ( )
Considere a estrutura e uma instância da tabela relacional FILIACAO exibida a seguir.
FILIACAO
Pessoa
Genitor
Alexandre
Francisco
Francisco
João
Joaquina
João
Carlota
Joaquina
João
Manuel
Paulo
Manuel
Maria
Paulo
Com relação à tabela FILIACAO, definida anteriormente, o comando SQL que produz a lista dos nomes das pessoas que são citadas na instância da referida tabela, sem repetições, é:
Aselect Pessoa FROM FILIACAO UNION ALL select Genitor FROM FILIACAO
Bselect Pessoa FROM FILIACAO UNION select Genitor FROM FILIACAO
Cselect distinct Pessoa, Genitor FROM FILIACAO
Dselect distinct Pessoa UNION distinct Genitor FROM FILIACAO
Eselect Pessoa FROM FILIACAO and select Genitor FROM FILIACAO
Revelar gabarito e comentário▾
GabaritoB — select Pessoa FROM FILIACAO
UNION select Genitor FROM FILIACAO
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”.
SQL: UNION e eliminação de duplicatas
Gabarito: letra B. O comando UNION combina os resultados de duas consultas e elimina automaticamente as linhas duplicadas, produzindo exatamente a lista de nomes citados na tabela FILIACAO sem repetições. As demais alternativas ou mantêm duplicatas (UNION ALL), ou não combinam as colunas corretamente (DISTINCT em duas colunas), ou apresentam sintaxe inválida.
O problema pede que listemos todos os nomes que aparecem na tabela, tanto na coluna Pessoa quanto na coluna Genitor, sem repetições. A tabela FILIACAO tem duas colunas: Pessoa (o filho) e Genitor (o pai). Para obter a lista completa de nomes, precisamos unir os valores das duas colunas. A operação de união em SQL é feita com UNION ou UNION ALL. A diferença crucial é que UNION remove duplicatas, enquanto UNION ALL mantém todas as linhas, inclusive as repetidas. Como o enunciado exige "sem repetições", o UNION é o operador correto.
Vamos analisar os dados: a coluna Pessoa contém {Alexandre, Francisco, Joaquina, Carlota, João, Paulo, Maria} e a coluna Genitor contém {Francisco, João, João, Joaquina, Manuel, Manuel, Paulo}. Unindo os dois conjuntos e removendo duplicatas, obtemos {Alexandre, Francisco, Joaquina, Carlota, João, Paulo, Maria, Manuel}. O UNION faz exatamente isso: combina os resultados de SELECT Pessoa FROM FILIACAO e SELECT Genitor FROM FILIACAO, eliminando as repetições.
A pegadinha da banca está em confundir UNION com UNION ALL. O UNION ALL também combina os resultados, mas não remove duplicatas — ele apenas concatena as linhas, mantendo todas as ocorrências. Se usássemos UNION ALL, teríamos 14 linhas (7 de cada coluna), com vários nomes repetidos (Francisco, João, Joaquina, Manuel, Paulo aparecem mais de uma vez). Portanto, a alternativa A está incorreta justamente por usar UNION ALL.
Outra confusão comum é achar que SELECT DISTINCT Pessoa, Genitor resolve o problema. Esse comando remove duplicatas considerando o par (Pessoa, Genitor) como um todo, não cada coluna separadamente. Como cada linha da tabela é única (não há pares repetidos), o DISTINCT não eliminaria nenhuma linha, e o resultado continuaria com 7 linhas, cada uma com dois nomes — não uma lista de nomes individuais. Além disso, a alternativa D tenta usar DISTINCT antes de UNION, o que é sintaticamente incorreto em SQL padrão (o DISTINCT é aplicado à consulta inteira, não a cada parte da união).
Por fim, a alternativa E usa a palavra and para conectar dois SELECT, o que não é válido em SQL — a forma correta de combinar resultados é com UNION, INTERSECT ou EXCEPT, não com AND.
Guarde a distinção central: UNION = remove duplicatas; UNION ALL = mantém todas as linhas. É exatamente essa diferença que separa a alternativa correta (B) da incorreta (A).
Operadores de união em SQL: UNION (Remove duplicatas, Atende "sem repetições"); UNION ALL (Mantém todas as linhas, Não atende "sem repetições"); DISTINCT (colunas múltiplas) (Remove pares repetidos, Não combina colunas em lista única)
Alternativa A — ❌ Incorreta
Usa UNION ALL, que combina os resultados das duas consultas sem eliminar duplicatas. O resultado teria 14 linhas, com nomes repetidos (Francisco, João, Joaquina, Manuel, Paulo aparecem mais de uma vez). O enunciado exige "sem repetições", portanto o UNION ALL não atende.
Alternativa B — ✅ Correta ⟵ GABARITO
O comando SELECT Pessoa FROM FILIACAO UNION SELECT Genitor FROM FILIACAO combina os valores das duas colunas e, por padrão, remove as linhas duplicadas. O resultado é a lista de todos os nomes citados na tabela, sem repetições: Alexandre, Francisco, Joaquina, Carlota, João, Paulo, Maria e Manuel. É exatamente o que o enunciado pede.
Alternativa C — ❌ Incorreta
SELECT DISTINCT Pessoa, Genitor FROM FILIACAO remove duplicatas considerando o par (Pessoa, Genitor). Como cada linha da tabela é única (não há pares repetidos), o DISTINCT não elimina nenhuma linha. O resultado seria uma tabela com 7 linhas, cada uma com dois nomes — não uma lista de nomes individuais. Além disso, não combina as duas colunas em uma única lista.
Alternativa D — ❌ Incorreta
A sintaxe SELECT DISTINCT Pessoa UNION DISTINCT Genitor FROM FILIACAO é inválida em SQL padrão. O DISTINCT é aplicado à consulta inteira, não a cada parte da união. A forma correta seria SELECT DISTINCT Pessoa FROM FILIACAO UNION SELECT DISTINCT Genitor FROM FILIACAO, mas mesmo assim o UNION já elimina duplicatas, tornando o DISTINCT redundante. A alternativa como escrita não é executável.
Alternativa E — ❌ Incorreta
A palavra and não é um operador válido para combinar duas consultas SELECT em SQL. A forma correta de unir resultados é com UNION, INTERSECT ou EXCEPT. O comando SELECT Pessoa FROM FILIACAO and SELECT Genitor FROM FILIACAO é sintaticamente incorreto e não seria aceito por nenhum SGBD.
NÃO CAIA NESSA!
A banca explora a confusão entre UNION e UNION ALL. O candidato que sabe que UNION remove duplicatas acerta; o que confunde os dois operadores cai na alternativa A. Lembre-se: UNION = sem repetição; UNION ALL = com repetição. Essa é a distinção que decide a questão.
NÃO CAIA NESSA!
Na prova, quando o enunciado pedir "sem repetições", procure o operador UNION (sem o ALL). Se pedir "incluindo repetições" ou "todas as ocorrências", use UNION ALL. Essa é uma pegadinha recorrente em questões de SQL.