mirror of
https://github.com/theoleuthardt/hwr-notes.git
synced 2026-06-06 02:21:07 +00:00
205 lines
6 KiB
Markdown
205 lines
6 KiB
Markdown
# Relationale Algebra – Zusammenfassung
|
||
**Dozent:** A. Zimmermann | HWR Berlin | 2026 | **Folien 1–16**
|
||
|
||
---
|
||
|
||
## 1. Definitionen (Folien 1–3)
|
||
|
||
### Formale Sprachen für Relationen
|
||
|
||
Es gibt zwei formale Sprachen für die Behandlung von Relationen:
|
||
|
||
| Sprache | Beschreibung |
|
||
|---|---|
|
||
| **Relationale Algebra** | Definiert Operationen über Relationen; Ergebnis ist wieder eine Relation (Geschlossenheit). Definiert **was** man will, nicht **wie** |
|
||
| **Relationenkalkül** | Deklarative Beschreibung gewünschter Ergebnisse |
|
||
|
||
Die relationale Algebra bildet die **Basis für SQL** (Structured Query Language).
|
||
|
||
**Beispiele Relationenkalkül:**
|
||
```
|
||
{ k | k ∈ KUNDEN ∧ k.STATUS = "Aktiv" }
|
||
{ [a.NAME, f.TITEL] | a∈ACTOR ∧ f∈FILM ∧ a.ID=f.A_ID }
|
||
```
|
||
|
||
### Grundoperatoren (vollständiger Satz)
|
||
|
||
| Operator | Notation | Beschreibung |
|
||
|---|---|---|
|
||
| **Selektion** | σ_Prädikat(Relation) | Zeilen filtern nach Bedingung |
|
||
| **Projektion** | π_Attribute(Relation) | Spalten auswählen |
|
||
| **Kartesisches Produkt** | R1 × R2 | Alle Kombinationen von Zeilen |
|
||
| **Umbenennung** | ρ_Alias(Relation) | Relation oder Attribute umbenennen |
|
||
| **Vereinigung** | R1 ∪ R2 | Tupel aus beiden Relationen zusammenfassen |
|
||
| **Differenz** | R1 — R2 | Tupel aus R1, die nicht in R2 vorkommen |
|
||
|
||
**Wichtig:** Dieser Satz ist **vollständig** — alle anderen Operatoren lassen sich durch diese ausdrücken.
|
||
|
||
---
|
||
|
||
## 2. Operatoren im Detail (Folien 4–15)
|
||
|
||
### 2.1 Selektion σ (Folie 4)
|
||
|
||
Filtert Zeilen einer Relation anhand eines Prädikats. Das Prädikat wird für **jede Zeile** geprüft.
|
||
|
||
**Beispiele:**
|
||
```
|
||
σ_{Semester > 10}(Studenten)
|
||
→ Ergebnis: MatrNr 24002 (Xenokrates, 18), MatrNr 25403 (Jonas, 12)
|
||
|
||
σ_{Name = 'Sokrates'}(Professoren)
|
||
→ Ergebnis: PersNr 2125, Sokrates, C4, Raum 226
|
||
```
|
||
|
||
### 2.2 Projektion π (Folie 5)
|
||
|
||
Wählt bestimmte Spalten aus einer Relation aus.
|
||
|
||
```
|
||
π_{MatrNr, Name}(Studenten)
|
||
→ Ergebnis: Nur MatrNr und Name aller Studenten
|
||
|
||
π_{Rang}(Professoren)
|
||
→ Ergebnis: C3, C4 (Duplikate werden in relationaler Algebra eliminiert!)
|
||
```
|
||
|
||
**Wichtig:** In relationaler Algebra gibt es **keine Duplikate**, in SQL schon (deshalb `DISTINCT`).
|
||
|
||
### 2.3 Zusammenhang Algebra ↔ SQL (Folien 6–7)
|
||
|
||
| Relationale Algebra | SQL |
|
||
|---|---|
|
||
| **π** (Projektion) | **SELECT** |
|
||
| **σ** (Selektion) | **WHERE** |
|
||
|
||
**Beispiele:**
|
||
|
||
| Anfrage | Algebra | SQL |
|
||
|---|---|---|
|
||
| Wie heißen die Professoren? | π_{Name}(Professoren) | `SELECT Name FROM Professoren;` |
|
||
| Name des Studenten mit MatrNr 25403? | π_{Name}(σ_{MatrNr=25403}(Studenten)) | `SELECT Name FROM Studenten WHERE MatrNr = 25403` |
|
||
| Studenten mit >6 Semestern? | π_{Name,MatrNr}(σ_{Semester>6}(Studenten)) | `SELECT Name, MatrNr FROM Studenten WHERE Semester > 6` |
|
||
|
||
### Reihenfolge der Operatoren (Folie 7)
|
||
|
||
**Grundsätzlich dürfen relationale Operatoren in zusammengesetzten Ausdrücken nicht vertauscht werden!**
|
||
|
||
```
|
||
π_{Name,MatrNr}(σ_{Semester>6}(Studenten)) ← korrekt
|
||
σ_{Semester>6}(π_{Name,MatrNr}(Studenten)) ← FALSCH (Semester ist nach Projektion weg!)
|
||
```
|
||
|
||
### 2.4 Umbenennung ρ (Folie 8)
|
||
|
||
Notwendig wenn:
|
||
- Relationen gleich benannte Attribute besitzen, die beide in der Abfrage benötigt werden
|
||
- Eine Relation **mehrfach** in einer Abfrage vorkommt (rekursive Beziehungen)
|
||
|
||
**Umbenennung ist immer temporär (operatorbezogen).**
|
||
|
||
```
|
||
ρ_{Relation-Alias}(Relation) ← Relation umbenennen
|
||
ρ_{Attribut-Alias ← Attribut}(Relation) ← Attribut umbenennen
|
||
```
|
||
|
||
### 2.5 Vereinigung ∪ (Folien 9–10)
|
||
|
||
**Voraussetzungen (Vereinigungskompatibilität):**
|
||
- Gleiche Anzahl von Attributen
|
||
- Attribute gleich benannt
|
||
- Gleichnamige Attribute haben denselben Datentyp
|
||
|
||
Zum Erfüllen der Kriterien können Projektion und Umbenennung verwendet werden.
|
||
|
||
**Ergebnis:** Selbes Schema wie die Operanden, Tupel zusammengefasst, **Duplikate eliminiert**.
|
||
|
||
```sql
|
||
SELECT Name FROM Studenten UNION
|
||
SELECT Name FROM Assistenten UNION
|
||
SELECT Name FROM Professoren;
|
||
```
|
||
|
||
**Beispiel:**
|
||
```
|
||
R = { [1, abc, 1.5], [2, def, 2.3] }
|
||
S = { [7, xyz, 4.4], [8, uvw, 6.7] }
|
||
R ∪ S = { [1, abc, 1.5], [2, def, 2.3], [7, xyz, 4.4], [8, uvw, 6.7] }
|
||
```
|
||
|
||
### 2.6 Differenz — (Folien 11–13)
|
||
|
||
**Gleiche Voraussetzungen** wie bei Vereinigung.
|
||
|
||
**Ergebnis:** Selbes Schema, enthält Tupel aus R1, die in R2 **nicht** vorkommen.
|
||
|
||
```
|
||
R = { [1, abc, 1.5], [2, def, 2.3] }
|
||
S = { [2, def, 2.3], [7, xyz, 4.4] }
|
||
R — S = { [1, abc, 1.5] }
|
||
```
|
||
|
||
**SQL-Umsetzung:**
|
||
```sql
|
||
-- Variante 1: NOT IN
|
||
SELECT Name FROM Studenten WHERE MatrNr NOT IN
|
||
(SELECT DISTINCT MatrNr FROM hoeren);
|
||
|
||
-- Variante 2: MINUS
|
||
SELECT MatrNr FROM Studenten
|
||
MINUS
|
||
SELECT DISTINCT MatrNr FROM hoeren;
|
||
```
|
||
|
||
### 2.7 Schnittmenge ∩ (Folie 14)
|
||
|
||
Die Schnittmenge ist **kein Grundoperator**, kann aber abgeleitet werden:
|
||
|
||
```
|
||
A ∩ B = A — (A — B) = B — (B — A)
|
||
```
|
||
|
||
**SQL-Umsetzung:**
|
||
```sql
|
||
-- Variante 1: INTERSECT
|
||
SELECT gelesenVon AS PersNr FROM Vorlesungen
|
||
INTERSECT
|
||
SELECT PersNr FROM Professoren WHERE Rang = 'C4';
|
||
|
||
-- Variante 2: IN (falls INTERSECT nicht verfügbar)
|
||
SELECT gelesenVon AS PersNr FROM Vorlesungen
|
||
WHERE PersNr IN
|
||
(SELECT PersNr FROM Professoren WHERE Rang = 'C4');
|
||
```
|
||
|
||
### 2.8 Kartesisches Produkt × und Join (Folie 15)
|
||
|
||
Komplexe Abfragen nutzen das kartesische Produkt mit anschließender Selektion (**Equi-Join**):
|
||
|
||
**Anfrage:** "Welche Studenten hören welche Vorlesungen?"
|
||
|
||
```
|
||
π_{s.Name, v.Titel}(σ_{h.VorlNr=v.VorlNr ∧ s.MatrNr=h.MatrNr}(
|
||
Studenten s × Vorlesungen v × hoeren h))
|
||
```
|
||
|
||
Oder ausführlich mit expliziter Umbenennung:
|
||
```
|
||
π_{s.Name, v.Titel}(σ_{v.VorlNr=h.VorlNr ∧ h.MatrNr=s.MatrNr}(
|
||
ρ_s(Studenten) × ρ_v(Vorlesungen) × ρ_h(hoeren)))
|
||
```
|
||
|
||
---
|
||
|
||
## Zusammenfassung
|
||
|
||
| Operator | Symbol | SQL-Entsprechung | Grundoperator? |
|
||
|---|---|---|---|
|
||
| Selektion | σ | WHERE | Ja |
|
||
| Projektion | π | SELECT | Ja |
|
||
| Kartesisches Produkt | × | FROM (Cross Join) | Ja |
|
||
| Umbenennung | ρ | AS | Ja |
|
||
| Vereinigung | ∪ | UNION | Ja |
|
||
| Differenz | — | MINUS / NOT IN | Ja |
|
||
| Schnittmenge | ∩ | INTERSECT / IN | Nein (ableitbar) |
|
||
| Join | ⋈ | JOIN ... ON | Nein (σ + ×) |
|