docs: add obsidian hwr docs

This commit is contained in:
theoleuthardt 2026-04-09 11:24:56 +02:00
parent b2636f4b92
commit 850aa3455d
245 changed files with 30757 additions and 0 deletions

View file

@ -0,0 +1,205 @@
# Relationale Algebra Zusammenfassung
**Dozent:** A. Zimmermann | HWR Berlin | 2026 | **Folien 116**
---
## 1. Definitionen (Folien 13)
### 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 415)
### 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 67)
| 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 910)
**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 1113)
**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 (σ + ×) |