# 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 (σ + ×) |