Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024

Banco de DadosConsultas 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
  1. Aoperação de junção.
  2. Boperação de atribuição.
  3. Coperações de união e de seleção.
  4. Doperações de produto cartesiano e de união.
  5. 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 (×).

  • Operadores Relacionais: Seleção (σ), Projeção (π), Junção (⋈) e Divisão (÷).

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).

Gabarito: letra A

Link permanente: /questoes/ce403649