Álgebra relacional

Operações sobre conjuntos, renomeação, junções, divisão e equivalências.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Regras de conjuntos

A álgebra clássica usa conjuntos: sem duplicados e sem ordem de tuplos. Cada operador recebe relações e devolve uma relação.

OperadorCondição e efeito
Seleção σp(R)\sigma_p(R)Conserva os tuplos que satisfazem pp. Não escolhe colunas.
Projeção πX(R)\pi_X(R)Conserva os atributos XX. Elimina tuplos repetidos.
Produto R×SR\times SCombina todos os pares; mm e nn tuplos dão mnmn. Exige nomes desambiguados.
Renomeação ρ\rhoMuda nomes de relação ou atributos, sem mudar valores. Explicita a convenção usada.
União R∪SR\cup STuplos de pelo menos um lado. Esquemas compatíveis.
Interseção R∩SR\cap STuplos dos dois lados. Vale R−(R−S)R-(R-S).
Diferença R−SR-STuplos de RR ausentes de SS. Não é comutativa.

A projeção generalizada admite expressões com nomes novos, como preço em euros a partir de cêntimos; a clássica só escolhe atributos existentes. Em SQL, reproduzir a semântica de conjuntos exige DISTINCT.

Que junção usar

  • A teta-junção R⋈pSR\bowtie_p S equivale a filtrar o produto: σp(R×S)\sigma_p(R\times S). A equijunção compara por igualdade.
  • A natural R⋈SR\bowtie S iguala todos os nomes comuns e conserva uma cópia de cada um. Sem nomes comuns, é o produto cartesiano.
  • A semijunção R⋉SR\ltimes S conserva os tuplos de RR com alguma correspondência, sem trazer colunas de SS.

Cliente(id, ...) com Encomenda(id, ..., idCliente) não se liga naturalmente pelo cliente: o nome comum id compara um cliente com uma encomenda. Liga por Cliente.id = Encomenda.idCliente ou renomeia antes da junção natural.

A agregação γ\gamma é uma extensão: γidCliente; count⁡(∗)→n(Encomenda)\gamma_{idCliente;\,\operatorname{count}(*)\to n}(Encomenda) conta encomendas por cliente, mas não cria grupo para Mia, sem encomendas. Para incluir zeros, parte do universo Cliente com junção externa.

Ausências e universais

Para quem nunca comprou, parte de todos os candidatos e retira os que aparecem:

Todos=πid(Cliente),Compradores=ρ(πidCliente(Encomenda)),SemCompra=Todos−Compradores.Todos=\pi_{id}(Cliente),\quad Compradores=\rho(\pi_{idCliente}(Encomenda)),\quad SemCompra=Todos-Compradores.

Renomeia antes da diferença para compatibilizar esquemas. Filtrar só encomendas nunca encontra quem não existe nelas.

Para R(X,Y)R(X,Y) e requisitos S(Y)S(Y), a divisão devolve os XX ligados a todos os YY:

C=πX(R),F=(C×S)−R,R÷S=C−πX(F).C=\pi_X(R),\qquad F=(C\times S)-R,\qquad R\div S=C-\pi_X(F).

FF lista os pares em falta. Com compras (1,10),(1,11),(2,11)(1,10),(1,11),(2,11) e requisitos 10,1110,11, só falta (2,10)(2,10); a resposta é {1}\{1\}. Se SS estiver vazio, devolve πX(R)\pi_X(R); para outro universo de candidatos, declara-o. “Comprou algo diferente de rato” aceita quem também comprou rato; “nunca comprou rato” exige a diferença.

Reescrever sem partir

σp∧q(R)=σp(σq(R))\sigma_{p\land q}(R)=\sigma_p(\sigma_q(R)). Antecipa um filtro que só usa um lado antes da junção; ao antecipar projeções, conserva os atributos da condição e da resposta.

Contraexemplo: com R(A,B)={(3,4)}R(A,B)=\{(3,4)\} e S(B,C)={(1,2)}S(B,C)=\{(1,2)\}, a junção por BB dá vazio, mas πA,C(πA(R)×σB=1(S))\pi_{A,C}(\pi_A(R)\times\sigma_{B=1}(S)) devolve (3,2)(3,2). A projeção apagou BB antes de exigir a condição.

Estas equivalências orientam um otimizador, não fixam o plano físico. Com NULL ou junções externas, não apliques automaticamente as identidades da álgebra clássica.

Construção da divisão.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.