Questão de Banco de Dados — Álgebra relacional — CESPE / CEBRASPE 2024
Banco de Dados›Álgebra relacional
Código
ce191204
Banca
CESPE / CEBRASPE
Órgão
CAGEPA - PB
Ano
2024
Nível
Superior
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 em consulta SQL
Gabarito: letra A. O comando SQL apresentado realiza uma junção (operação ⋈) entre a tabela Cliente e ela mesma, combinando pares de linhas com base na condição de correspondência a.cpf = b.CPF_cliente_antigo. A junção é a operação da álgebra relacional que corresponde exatamente a essa combinação condicionada de tuplas de duas relações.
A álgebra relacional é uma linguagem formal de consulta composta por operações que recebem uma ou duas relações (tabelas) como entrada e produzem uma nova relação como saída — propriedade conhecida como fechamento. Entre essas operações, a junção (⋈) é a que "combina pares de linhas de duas relações com base em alguma condição de correspondência entre os atributos". É precisamente isso que o comando SQL faz: ele combina cada linha da tabela Cliente (aliás a) com cada linha da mesma tabela (aliás b) onde o CPF de uma é igual ao CPF_cliente_antigo da outra, retornando o nome do cliente antigo, o nome do cliente novo e a renda deste.
Para entender por que as demais alternativas estão incorretas, é essencial distinguir as operações da álgebra relacional. A seleção (σ) filtra tuplas que satisfazem um predicado — no SQL, corresponde à cláusula WHERE sem junção. A projeção (Π) filtra atributos especificados — corresponde à lista de colunas do SELECT. O produto cartesiano (×) combina todos os pares de linhas de duas relações, independentemente de correspondência — corresponde ao FROM com duas tabelas sem condição de junção. A união (∪) combina tuplas de duas relações compatíveis — corresponde ao UNION do SQL. A diferença (−) retorna tuplas que estão em uma relação mas não na outra — corresponde ao EXCEPT. A atribuição (←) armazena o resultado de uma operação em uma relação temporária.
No comando em questão, há duas referências à mesma tabela (Cliente a, Cliente b), o que caracteriza um auto-relacionamento (self-join). O WHERE a.cpf = b.CPF_cliente_antigo estabelece a condição de correspondência entre as duas instâncias da tabela. Essa combinação condicionada é exatamente o que a operação de junção representa na álgebra relacional. O produto cartesiano sozinho produziria todas as combinações possíveis entre as linhas das duas instâncias, sem filtrar aquelas que satisfazem a condição — o que não atenderia ao objetivo de retornar apenas os pares de cliente antigo e novo relacionados.
A pegadinha desta questão está em reconhecer que a condição WHERE com igualdade entre atributos de duas tabelas (ou da mesma tabela com aliases diferentes) caracteriza uma junção, e não uma mera seleção ou produto cartesiano. O candidato que confunde a cláusula WHERE com a operação de seleção pode ser induzido a escolher uma alternativa incorreta. A distinção fundamental: a seleção filtra linhas de UMA relação com base em um predicado sobre seus próprios atributos; a junção combina linhas de DUAS relações com base em uma condição que envolve atributos de ambas.
Guarde essa fronteira: junção = combinação condicionada de duas relações; seleção = filtro de linhas de uma relação; produto cartesiano = combinação sem condição. É exatamente nessa distinção que as alternativas se dividem.
Operações da Álgebra Relacional — só Junção: 1; só Seleção: 1; Junção∩Seleção: 0
Alternativa A — ✅ Correta ⟵ GABARITO
A operação de junção (⋈) combina pares de linhas de duas relações com base em uma condição de correspondência entre atributos. No comando, a condição a.cpf = b.CPF_cliente_antigo estabelece exatamente essa correspondência entre as duas instâncias da tabela Cliente. O SELECT a.nome, b.nome, a.renda projeta os atributos desejados do resultado da junção. Portanto, o SGBD deve realizar uma junção para retornar os valores desejados.
Alternativa B — ❌ Incorreta
A operação de atribuição (←) armazena o resultado de uma operação em uma relação temporária. Ela não combina linhas de relações — é uma operação auxiliar que dá nome a um resultado intermediário. No comando apresentado, não há qualquer atribuição a uma relação temporária; há apenas uma consulta que combina linhas da tabela Cliente consigo mesma. A atribuição não é a operação responsável por retornar os pares de cliente antigo e novo.
Alternativa C — ❌ Incorreta
A união (∪) combina tuplas de duas relações compatíveis (mesmos atributos), e a seleção (σ) filtra tuplas que satisfazem um predicado. No comando, não há união de duas relações — há uma única tabela referenciada duas vezes. Além disso, a condição a.cpf = b.CPF_cliente_antigo não é uma simples seleção sobre uma relação; ela envolve atributos de duas instâncias da tabela, caracterizando uma junção. A união nem sequer se aplica ao contexto, pois não há duas relações distintas para combinar.
Alternativa D — ❌ Incorreta
O produto cartesiano (×) combinaria todos os pares de linhas das duas instâncias da tabela, sem qualquer condição. A união (∪) não se aplica, pois não há duas relações distintas para unir. O comando, porém, aplica uma condição de correspondência (a.cpf = b.CPF_cliente_antigo) sobre o produto cartesiano, o que transforma a operação em uma junção. A alternativa erra ao afirmar que apenas produto cartesiano e união são necessários — a condição de igualdade entre atributos é o que define a junção.
Alternativa E — ❌ Incorreta
O produto cartesiano (×) sem condição produziria todas as combinações possíveis, e a diferença (−) retornaria tuplas que estão em uma relação mas não em outra. Nenhuma dessas operações corresponde ao que o comando faz. A diferença não tem qualquer papel na consulta, pois não há subtração de conjuntos de tuplas. A condição de igualdade no WHERE caracteriza a junção, não o produto cartesiano puro.
NÃO CAIA NESSA!
A banca explora a confusão entre a cláusula WHERE e a operação de seleção. Muitos candidatos veem o WHERE e pensam em seleção (σ), mas a condição a.cpf = b.CPF_cliente_antigo envolve atributos de duas instâncias da mesma tabela — isso é junção, não seleção. A seleção filtra linhas de uma única relação com base em um predicado sobre seus próprios atributos; a junção combina linhas de duas relações com base em uma condição que as relaciona. Identifique a presença de duas referências a tabelas (com aliases) e uma condição de igualdade entre atributos delas: isso é o gatilho para reconhecer a junção.
PEGA ESSA DICA!
Para distinguir as operações na prova, associe cada uma à sua tradução SQL: seleção → WHERE sem junção; projeção → lista de colunas do SELECT; produto cartesiano → FROM com duas tabelas sem condição; junção → FROM com duas tabelas e condição de igualdade no WHERE (ou JOIN ... ON); união → UNION; diferença → EXCEPT; atribuição → CREATE TABLE AS ou variável temporária. Quando a consulta usa a mesma tabela duas vezes com aliases diferentes e uma condição de igualdade entre elas, é um auto-join — sempre junção.
Gabarito: letra A — a operação de junção é a que o SGBD deve realizar para retornar os valores desejados.