Álgebra Relacional
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\)).