Álgebra Relacional

Autor

Douglas Braga

A álgebra relacional é uma linguagem de consulta procedural composta por um conjunto de operações que recebem uma ou duas relações como entrada e produzem uma nova relação como resultado.

Na álgebra relacional, cada operação recebe uma ou duas relações como operandos e retorna uma nova relação. Isso permite composição: o resultado de uma operação pode ser usado como entrada de outra, formando expressões arbitrariamente complexas.

Operadores Básicos

Existem seis operadores fundamentais da álgebra relacional:

Operador Símbolo Tipo Descrição
Seleção \(\sigma\) Unário Filtra tuplas que satisfazem um predicado
Projeção \(\Pi\) Unário Seleciona um subconjunto de atributos (colunas)
União \(\cup\) Binário Retorna todas as tuplas de duas relações compatíveis
Diferença de conjuntos \(-\) Binário Retorna tuplas presentes em uma relação mas não na outra
Produto Cartesiano \(\times\) Binário Combina todas as tuplas de duas relações
Renomeação \(\rho\) Unário Renomeia a relação resultado ou seus atributos

Além dos seis operadores básicos, operações adicionais — como junção (\(\bowtie\)), interseção (\(\cap\)) e agregação (\(\gamma\)) — podem ser derivadas a partir dos básicos ou são extensões convenientes.

Expressões de Álgebra Relacional

A composição de operações permite construir expressões de álgebra relacional complexas. Por exemplo, para encontrar os nomes dos professores da ESETI e os títulos das disciplinas de ENS com carga horária acima de 120 h:

\[\Pi_{nome}\!\left(\sigma_{escola = \text{"ESETI"}}(professor)\right)\]

\[\Pi_{codigo,\ nome\_disciplina}\!\left(\sigma_{sigla\_curso = \text{"ENS"} \,\wedge\, carga\_horaria > 120}(disciplina)\right)\]

Nessas expressões: 1. \(\sigma\) filtra as tuplas relevantes 2. \(\Pi\) projeta apenas os atributos desejados 3. O resultado é uma nova relação — que pode ser usada como entrada de novas operações

Nas seções seguintes, cada operador é apresentado em detalhe com exemplos usando as tabelas da UnDF.


Para Praticar

1. Composição de operações. Escreva uma expressão de álgebra relacional para encontrar os nomes de todos os alunos do curso de Pedagogia (PED) ingressantes em 2023.

\[\Pi_{nome}\!\left(\sigma_{sigla\_curso = \text{"PED"}\ \wedge\ ano\_ingresso = 2023}(aluno)\right)\]


2. Ordem importa? As duas expressões abaixo são equivalentes? Qual é mais eficiente e por quê?

Expressão A: \(\Pi_{nome}\!\left(\sigma_{escola = \text{"ESETI"}}(professor)\right)\)

Expressão B: \(\sigma_{escola = \text{"ESETI"}}\!\left(\Pi_{nome}(professor)\right)\)

Não são equivalentes. A Expressão A aplica \(\sigma\) primeiro (mantendo o atributo escola disponível para o filtro) e depois projeta apenas nome — resultado correto: nomes dos professores da ESETI.

A Expressão B é inválida: \(\Pi_{nome}(professor)\) elimina a coluna escola antes da seleção, tornando o predicado \(escola = \text{"ESETI"}\) inaplicável.

Em álgebra relacional, \(\sigma\) deve poder acessar os atributos usados no predicado. A “otimização” de aplicar projeção cedo só é válida quando se mantêm os atributos necessários para as seleções seguintes.


3. Resultado vazio. O que acontece quando um operador recebe uma relação vazia como entrada? Por exemplo:

\[\sigma_{semestre > 10}(disciplina)\]

O resultado é uma relação vazia — uma tabela com zero tuplas mas com o mesmo schema de disciplina. Relações vazias são perfeitamente válidas e podem ser usadas como entrada de outras operações (ex.: \(\emptyset \cup r = r\); \(\emptyset \times r = \emptyset\)).