Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024
Banco de Dados›Consultas e Comandos em SQL
Código
ce403649
Banca
CESPE / CEBRASPE
Órgão
CAGEPA
Ano
2024
Cargo
Ana Sist ( )
Uma empresa necessita de um banco de dados para registro de dados de seus clientes, tais como CPF, nome e renda. A fim de identificar unicamente cada um dos clientes, foi escolhido o CPF como chave primária. Nessa empresa, um novo cliente, para ser aceito, precisa ser indicado por um e somente um cliente antigo, que pode ainda não ter indicado ninguém ou já ter indicado vários novos. Os clientes antigos não precisaram ser indicados por outro cliente. No modelo lógico do banco de dados, foi incluído no registro dos clientes, para identificar quem foi o responsável pela indicação, o CPF_cliente_antigo, que pode receber um valor nulo.
Nesse contexto, considere o comando SQL/ANSI a seguir.
Select a.nome, b.nome, a.renda
from Cliente a, Cliente b
where a.cpf = b.CPF_cliente_antigo
order by 1;
Leia o Texo CC1A1. Em relação à álgebra relacional, para que o comando apresentado no texto CC1A1 retorne os valores desejados, o sistema gerenciador deve realizar
Aoperação de junção.
Boperação de atribuição.
Coperações de união e de seleção.
Doperações de produto cartesiano e de união.
Eoperações de produto cartesiano e de diferença.
Revelar gabarito e comentário▾
GabaritoA — operação de junção.
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”.
Álgebra Relacional: Junção (JOIN) em SQL
Gabarito: letra A. O comando SQL apresentado realiza uma junção (operação ⋈) entre a tabela Cliente consigo mesma (self-join), combinando as linhas com base na condição de correspondência a.cpf = b.CPF_cliente_antigo. A álgebra relacional traduz essa consulta como uma junção, que equivale a um produto cartesiano seguido de uma seleção, com a remoção das colunas duplicadas.
A questão cobra a correspondência entre comandos SQL e operações da álgebra relacional. O comando SELECT ... FROM Cliente a, Cliente b WHERE a.cpf = b.CPF_cliente_antigo é a forma clássica de escrever uma junção em SQL/ANSI, usando a sintaxe implícita (vírgula no FROM + condição no WHERE). A álgebra relacional expressa exatamente essa operação com o operador de junção (⋈).
O que é a Álgebra Relacional?
A álgebra relacional é uma linguagem formal de consulta que define um conjunto de operações sobre relações (tabelas). Cada operação recebe uma ou duas relações como entrada e retorna uma nova relação como saída. Essas operações são a base teórica para a implementação da linguagem SQL, que é declarativa — o usuário especifica o que quer, e o SGBD decide como executar.
As operações da álgebra relacional se dividem em duas categorias principais:
Operadores de Conjuntos Tradicionais: União (∪), Interseção (∩), Diferença (−) e Produto Cartesiano (×).
Além disso, as operações são classificadas em unárias (operam sobre uma única relação — seleção, projeção, renomeação e atribuição) e binárias (tomam duas relações como entrada — produto cartesiano, junção, união, interseção, diferença e divisão).
A Junção (⋈) e sua relação com o Produto Cartesiano
A operação de junção é a que mais se aproxima do comando SQL apresentado. Ela combina pares de linhas de duas relações com base em uma condição de correspondência entre atributos. Em termos de álgebra relacional, a junção é definida como um produto cartesiano seguido de uma seleção, com a remoção das colunas duplicadas.
O produto cartesiano (×) combina todos os pares de linhas das duas relações de entrada, independentemente de haver correspondência. Já a seleção (σ) filtra as tuplas que satisfazem um predicado. A junção, portanto, é a combinação dessas duas operações: primeiro cruza tudo (produto cartesiano) e depois filtra apenas os pares que atendem à condição de igualdade (seleção).
No comando SQL do enunciado:
SELECT a.nome, b.nome, a.renda
FROM Cliente a, Cliente b
WHERE a.cpf = b.CPF_cliente_antigo
ORDER BY 1;
A cláusula FROM Cliente a, Cliente b gera o produto cartesiano entre a tabela Cliente (como a) e a tabela Cliente (como b). A cláusula WHERE a.cpf = b.CPF_cliente_antigo aplica a seleção, filtrando apenas os pares onde o CPF do cliente a é igual ao CPF do cliente antigo que o indicou (campo CPF_cliente_antigo do cliente b). Essa sequência — produto cartesiano + seleção — é exatamente a definição da operação de junção.
Exemplo prático
Suponha a tabela Cliente com os seguintes dados:
cpf
nome
renda
CPF_cliente_antigo
111
Ana
5000
NULL
222
Bruno
3000
111
333
Carla
4000
111
444
Diego
2000
222
O comando SQL retornaria:
a.nome
b.nome
a.renda
Bruno
Ana
3000
Carla
Ana
4000
Diego
Bruno
2000
Ou seja, para cada cliente a, ele busca o nome do cliente antigo b que o indicou. Isso é uma junção (self-join) da tabela com ela mesma.
Distinção entre Junção e Produto Cartesiano
A pegadinha da questão está em distinguir a junção do produto cartesiano puro. O produto cartesiano, sem a condição de seleção, retornaria todas as combinações possíveis de linhas (4 × 4 = 16 linhas no exemplo). A junção, porém, filtra essas combinações pela condição de igualdade, retornando apenas as linhas que têm correspondência.
Operação
Símbolo
O que faz
Equivalência SQL
Produto Cartesiano
×
Combina todos os pares de linhas
FROM a, b (sem WHERE)
Junção
⋈
Combina pares com base em condição
FROM a, b WHERE condição ou JOIN ... ON
Seleção
σ
Filtra linhas
WHERE
Projeção
π
Filtra colunas
SELECT
Análise das Alternativas
Álgebra relacional
1Operações unárias
Seleção (σ)
Projeção (π)
Renomeação
Atribuição
2Operações binárias
Junção (⋈)
Produto cartesiano + seleção
Remove colunas duplicadas
Produto cartesiano (×)
União (∪)
Interseção (∩)
Diferença (−)
3Junção no SQL
FROM a, b WHERE condição
JOIN ... ON condição
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
A operação de junção é exatamente o que o comando SQL realiza. A consulta combina a tabela Cliente consigo mesma (self-join) usando a condição a.cpf = b.CPF_cliente_antigo. Na álgebra relacional, isso corresponde à operação de junção (⋈), que é definida como produto cartesiano seguido de seleção, com remoção de colunas duplicadas. A sintaxe FROM Cliente a, Cliente b WHERE ... é a forma implícita de escrever uma junção em SQL/ANSI.
Alternativa B — ❌ Incorreta
A operação de atribuição (←) é usada para armazenar o resultado de uma operação em uma relação temporária. Ela não combina dados de duas relações, apenas nomeia o resultado de uma consulta. No comando apresentado, não há nenhuma atribuição a uma relação temporária — o SELECT apenas retorna os dados diretamente.
Alternativa C — ❌ Incorreta
A alternativa menciona união (∪) e seleção (σ). A união combina tuplas de duas relações compatíveis (mesmos atributos), o que não ocorre aqui — a consulta combina linhas da mesma tabela com base em uma condição, não une conjuntos de linhas. A seleção (σ) está presente implicitamente na condição do WHERE, mas sozinha não explica a combinação das duas instâncias da tabela. A operação central é a junção, não a união.
Alternativa D — ❌ Incorreta
A alternativa menciona produto cartesiano (×) e união (∪). O produto cartesiano é parte da junção (é o primeiro passo), mas a consulta não para no produto cartesiano — ela aplica a condição de seleção para filtrar os pares. Além disso, não há operação de união envolvida. A junção é a operação completa que engloba o produto cartesiano + seleção.
Alternativa E — ❌ Incorreta
A alternativa menciona produto cartesiano (×) e diferença (−). A diferença é uma operação de conjunto que retorna tuplas que estão em uma relação mas não em outra. Não há nenhuma operação de diferença na consulta — ela apenas combina linhas com base em uma condição de igualdade. O produto cartesiano, como na alternativa D, é apenas parte do processo, mas a operação final é a junção.
Conclusão
A questão testa o conhecimento da correspondência entre SQL e álgebra relacional. O comando SELECT ... FROM Cliente a, Cliente b WHERE a.cpf = b.CPF_cliente_antigo é a implementação clássica de uma junção (self-join) em SQL. Na álgebra relacional, a junção (⋈) é a operação que combina pares de linhas com base em uma condição de correspondência, sendo definida como produto cartesiano seguido de seleção. As demais alternativas citam operações que não correspondem ao que o comando faz: atribuição (armazenar resultado), união (combinar conjuntos), diferença (subtrair conjuntos) ou apenas o produto cartesiano (sem a seleção).