Operação de Projeção
A operação de projeção retorna uma relação com apenas um subconjunto dos atributos da relação original, eliminando colunas indesejadas.
Notação e Sintaxe
\[\Pi_{A_1, A_2, \ldots, A_k}(r)\]
onde \(r\) é uma relação e \(A_1, A_2, \ldots, A_k\) são os atributos que devem ser mantidos no resultado.
Como o resultado é uma relação (um conjunto), linhas duplicadas são automaticamente eliminadas.
Exemplo 1: Projeção Simples
Para obter apenas id_prof e nome de todos os professores — omitindo id_escola e ch_semanal:
\[\Pi_{id\_prof,\ nome}(professor)\]
Relação original professor:
| id_prof | nome | id_escola | ch_semanal |
|---|---|---|---|
| 21200001 | Eduarda Souza | 21 | 20 |
| 21400002 | Felipe Araujo | 21 | 40 |
| 31200001 | Gustavo Costa | 31 | 20 |
| 31400002 | Helena Carvalho | 31 | 40 |
| 31200003 | Igor Melo | 31 | 20 |
| 11400001 | Bruno Teixeira | 11 | 40 |
| 11400002 | Carla Pinto | 11 | 40 |
Resultado de \(\Pi_{id\_prof,\ nome}(professor)\):
| id_prof | nome |
|---|---|
| 21200001 | Eduarda Souza |
| 21400002 | Felipe Araujo |
| 31200001 | Gustavo Costa |
| 31400002 | Helena Carvalho |
| 31200003 | Igor Melo |
| 11400001 | Bruno Teixeira |
| 11400002 | Carla Pinto |
Eliminação de Duplicatas
Se projetarmos apenas id_escola de professor, o resultado terá somente os valores distintos:
\[\Pi_{id\_escola}(professor)\]
| id_escola |
|---|
| 21 |
| 31 |
| 11 |
Mesmo que 31 apareça em três tuplas (Gustavo, Helena e Igor), o resultado contém cada valor apenas uma vez.
Composição de Operações
Como o resultado de qualquer operação é uma relação, operações podem ser compostas — o resultado de uma operação serve como entrada da próxima.
Composição de operações: expressões de álgebra relacional são construídas aninhando operações. O resultado de uma operação interna é passado como argumento para a operação externa.
Para obter os nomes de todos os professores da ESETI, combina-se seleção e projeção:
\[\Pi_{nome}\!\left(\sigma_{id\_escola = 31}(professor)\right)\]
Passo 1 — Seleção \(\sigma_{id\_escola = 31}(professor)\):
| id_prof | nome | id_escola | ch_semanal |
|---|---|---|---|
| 31200001 | Gustavo Costa | 31 | 20 |
| 31400002 | Helena Carvalho | 31 | 40 |
| 31200003 | Igor Melo | 31 | 20 |
Passo 2 — Projeção \(\Pi_{nome}(\cdot)\):
| nome |
|---|
| Gustavo Costa |
| Helena Carvalho |
| Igor Melo |
Para Praticar
1. Idempotência da projeção. A projeção é idempotente quando aplicada sobre o mesmo conjunto de atributos:
\[\Pi_A\!\left(\Pi_{A,B}(r)\right) = \Pi_A(r)\]
Mas o que acontece se tentarmos \(\Pi_{A,B}\!\left(\Pi_A(r)\right)\) quando \(B \notin A\)?
A expressão é inválida: \(\Pi_A(r)\) elimina o atributo \(B\), que passa a não existir na relação resultante. Tentar projetar \(B\) de uma relação que não o possui é um erro de schema. Isso ilustra que a projeção é destrutiva em relação aos atributos não selecionados.
2. Quantas tuplas? Calcule o número de tuplas esperado em cada resultado:
- \(\Pi_{id\_escola}(professor)\) — a tabela
professortem 7 tuplas distribuídas em 3 escolas - \(\Pi_{id\_curso}(disciplina)\) — 24 disciplinas distribuídas em 3 cursos
- \(\Pi_{id\_prof, id\_escola}(professor)\) — 7 tuplas, combinação de atributos
- 3 tuplas — a projeção elimina duplicatas; há exatamente 3 valores distintos de
id_escola. - 3 tuplas — idem; 3 cursos distintos.
- 7 tuplas — como
id_profé a chave primária, cada combinação (id_prof, id_escola) já é única. A projeção não elimina nenhuma tupla.
Observação: a projeção sobre a chave primária nunca elimina tuplas — o número é preservado.
3. Projeção e junção. Após fazer a junção \(professor \bowtie_{professor.id\_escola = escola.id\_escola} escola\), queremos apenas os nomes dos professores e o nome completo da escola. Escreva a expressão completa.
\[\Pi_{professor.nome,\ escola.nome\_escola}\!\left(professor \bowtie_{professor.id\_escola = escola.id\_escola} escola\right)\]
O resultado tem 7 tuplas (uma por professor), com os atributos nome e nome_escola.