6 KiB
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.
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:
-- 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:
-- 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 (σ + ×) |