Inhaltsverzeichnis
Relationale Algebra
Vom ER-Modell zur relationalen Algebra
Das Entity-Relationship-Modell beantwortet die Frage, welche Objekte und Beziehungen eine Datenbank beschreiben soll — doch mit einem Diagramm lässt sich nicht rechnen. Um tatsächlich mit Daten arbeiten zu können, braucht man eine andere Darstellung: Relationen. Eine Relation ist eine Tabelle mit einem festen Schema aus benannten Spalten (Attributen) und einer Menge von Zeilen (Tupeln). Ein ER-Diagramm lässt sich systematisch in ein solches Relationenschema übersetzen, erst dann können Daten gespeichert und verwaltet werden.
Damit stellt sich die Frage: Wie arbeitet man mit Relationen? Die relationale Algebra gibt darauf eine formale Antwort. Sie definiert eine Menge von Operationen, die Relationen als Eingabe nehmen und wieder eine Relation zurückliefern — wie die gewöhnliche Algebra mit Zahlen. Operationen lassen sich so beliebig schachteln und zu komplexen Anfragen zusammensetzen. Entwickelt wurde die relationale Algebra 1970 von Edgar F. Codd, der damit zugleich das relationale Datenbankmodell begründete.
SQL ist im Kern eine lesbare Schreibweise für relationale Algebra:WHERE = Selektion, SELECT = Projektion, JOIN = Verbund.
In der Praxis schreibt man solche Anfragen in SQL — und SQL ist im Kern nichts anderes als eine lesbare Schreibweise für relationale Algebra: WHERE entspricht einer Selektion, SELECT einer Projektion, JOIN einem Verbund. Wer die Algebra versteht, versteht deshalb nicht nur eine Syntax, sondern das Konzept dahinter.
Relation und Relationenschema
Bevor man mit Operationen arbeiten kann, muss klar sein, womit man es eigentlich zu tun hat. Die folgenden Definitionen bauen aufeinander auf:
| Begriff | Formal | Tabellen-entsprechung | Beispiel |
|---|---|---|---|
| Domäne | Menge zulässiger Werte | Datentyp einer Spalte | dom(A) = ℤ |
| Relationen-schema | Tabellenstruktur (Spaltennamen) | ||
| Tupel | Element | Eine Zeile | ('Amir', 11) |
| Relation | Endliche Menge von Tupeln | Die gesamte Tabelle mit Daten |
Domäne
Eine Domäne ist eine (nicht leere) Menge zulässiger Werte für ein Attribut — also der Wertebereich, aus dem ein Attribut seine Werte zieht. Beispiele sind:
- (ganze Zahlen)
- oder
- eine konkrete Aufzählung wie .
Jedem Attribut ist genau eine Domäne zugeordnet.
Schema
Ein Relationenschema (Schema) ist eine endliche, geordnete Liste von Attributnamen , denen jeweils eine Domäne zugeordnet ist. Das Schema beschreibt die Struktur einer Tabelle, welche Spalten es gibt und welche Werte darin erlaubt sind, enthält aber selbst noch keine Daten. Man schreibt es zum Beispiel als:
- Schueler(SID: ℤ, Name: String, Klasse: String, Jahrgang: ℤ)
Spielt die Domäne keine Rolle, wird diese oft auch weggelassen:
- Schueler(SID, Name, Klasse, Jahrgang)
Tupel
Ein Tupel über dem Schema ist eine Abbildung, die jedem Attribut genau einen Wert aus zuweist:
Beispiele sind:
- (1, 'Amir', '12a', 2024)
- (10, 'Inf', 'Fr. Novak')
Relation
Eine Relation über dem Schema ist eine endliche Teilmenge des kartesischen Produkts der Domänen:
Das kartesische Produkt enthält alle denkbaren Kombinationen von Werten aus den Domänen, die Relation ist davon eine Auswahl der tatsächlich gespeicherten Tupel. Zum Beispiel ergibt sich für die Mengen und für das Produkt:
Da eine Relation eine Menge im mathematischen Sinne ist, hat sie zwei wichtige Konsequenzen: Es gibt keine Reihenfolge der Tupel (Zeilen haben keine feste Position), und es gibt keine Duplikate (zwei Tupel, die in allen Attributwerten übereinstimmen, gelten als identisch und kommen nur einmal vor).
Da sich endliche Relationen sehr gut als Tabelle darstellen lassen, werde an vielen Stellen die Begriffe Relation und Tabelle synonym verwendet.Das Relationenschema ergibt sich direkt aus der Übersetzung des ER-Modells. Jede Entitätsmenge wird zu einem Schema, ihre Attribute bleiben erhalten, und der Primärschlüssel wird übernommen. Beziehungen werden, je nach Kardinalität, entweder als eigene Relation modelliert oder durch einen Fremdschlüssel in einer der beteiligten Relationen ausgedrückt.
Die Grundoperatoren
Damit die Wirkung jeder Operation ohne Umwege ablesbar ist, arbeiten wir in diesem Abschnitt mit kleinen, abstrakten Relationen (, , , , ...) mit einfachen Werten wie oder . Jedes Beispiel nennt zuerst die Eingabe-Relation(en), dann den Ausdruck, dann das Ergebnis. Die Übungsaufgaben am Ende wenden die Operatoren anschließend auf das Schulschema von oben an.
1. Selektion (σ)
Notation:
Das griechische Sigma () steht für „select" — die Selektion wählt Zeilen aus, ohne die Struktur zu verändern. Die Selektion filtert Zeilen einer Relation anhand einer Bedingung. Das Ergebnis enthält nur diejenigen Tupel, für die die Bedingung wahr ist. Das Schema (also die Spalten) bleibt dabei unverändert.
Beispiel: (alle Tupel mit )
| R | ||
|---|---|---|
| A | B | C |
| 1 | a | 2 |
| 2 | a | 2 |
| 3 | c | 1 |
| 1 | b | 4 |
| σA=1(R) | ||
|---|---|---|
| A | B | C |
| 1 | a | 2 |
| 1 | b | 4 |
Bedingungen können mit (UND), (ODER) und (NICHT) kombiniert werden:
Beispiel:
| R | ||
|---|---|---|
| A | B | C |
| 1 | a | 2 |
| 2 | a | 2 |
| 3 | c | 1 |
| 1 | b | 4 |
| σA=2∨B='c'(R) | ||
|---|---|---|
| A | B | C |
| 2 | a | 2 |
| 3 | c | 1 |
2. Projektion (π)
Notation:
Das griechische Pi () steht für „project". Die Projektion wählt Spalten aus einer Relation aus. Alle anderen Spalten werden weggelassen. Doppelte Zeilen werden im Ergebnis automatisch entfernt (da eine Relation per Definition eine Menge ist, also keine Duplikate enthält).
Beispiel: (nur die Spalten und )
Die Kombination erscheint nur einmal, obwohl sie in der Eingabe zweimal vorkommt (bei und bei ).| R | ||
|---|---|---|
| A | B | C |
| 1 | a | 2 |
| 2 | a | 2 |
| 3 | c | 1 |
| 1 | b | 4 |
| πB,C(R) | |
|---|---|
| B | C |
| a | 2 |
| c | 1 |
| b | 4 |
3. Kombination von Selektion und Projektion
Da jede Operation wieder eine Relation liefert, können Operationen problemlos verschachtelt werden. Um nur die -Werte aller Tupel mit zu erhalten:
Die Auswertung erfolgt von innen nach außen: zuerst wird selektiert (Zeilen filtern), dann projiziert (Spalten auswählen).
| R | ||
|---|---|---|
| A | B | C |
| 1 | a | 2 |
| 2 | a | 2 |
| 3 | c | 1 |
| 1 | b | 4 |
| πB(σA=1(R)) |
|---|
| B |
| a |
| b |
4. Umbenennung (ρ)
Das griechische Rho () steht für „rename". Notation: oder
Die Umbenennung gibt einer Relation oder einzelnen Attributen einen neuen Namen. Das ist besonders wichtig, wenn zwei Relationen mit gleichen Attributnamen verknüpft werden sollen.
Beispiel: Die Relation soll unter dem neuen Namen geführt werden und ihre Attribute in umbenennen:
Die Menge der Tupel bleibt identisch, nur das Schema ändert sich.| R | ||
|---|---|---|
| A | B | C |
| 1 | a | 2 |
| 2 | a | 2 |
| 3 | c | 1 |
| 1 | b | 4 |
| S | ||
|---|---|---|
| X | Y | Z |
| 1 | a | 2 |
| 2 | a | 2 |
| 3 | c | 1 |
| 1 | b | 4 |
5. Vereinigung (∪)
Notation:
Die Vereinigung fügt die Tupel zweier Relationen zusammen. Doppelte Tupel werden automatisch entfernt. Beide Relationen müssen vereinigungskompatibel sein, d. h. sie müssen die gleiche Anzahl an Attributen mit kompatiblen Datentypen haben.
Vereinigungskompatibel: gleiche Attributanzahl und Domänen, Attributnamen dürfen abweichen.| R | |
|---|---|
| A | B |
| 1 | 2 |
| 1 | 3 |
| S | |
|---|---|
| C | D |
| 1 | 2 |
| 2 | 3 |
| R ∪ S | |
|---|---|
| A | B |
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
Das Tupel kommt in beiden Relationen vor und erscheint im Ergebnis deshalb nur einmal.
6. Differenz (−)
Notation:
Die Differenz liefert alle Tupel, die in , aber nicht in enthalten sind. Auch hier gilt die Voraussetzung der Vereinigungskompatibilität.
| R | |
|---|---|
| A | B |
| 1 | 2 |
| 1 | 3 |
| S | |
|---|---|
| C | D |
| 1 | 2 |
| 2 | 3 |
| R − S | |
|---|---|
| A | B |
| 1 | 3 |
7. Schnittmenge (∩)
Notation:
Die Gültigkeit von lässt sich einfach mit einem Mengendiagramm (Venn-Diagramm) zeigen. Die Schnittmenge liefert alle Tupel, die sowohl in als auch in enthalten sind. Die Schnittmenge ist kein eigenständiger Grundoperator, sondern lässt sich durch Differenz ausdrücken: . Sie wird dennoch häufig als abgeleiteter Operator verwendet, da sie ausdrucksstärker ist.
| R | |
|---|---|
| A | B |
| 1 | 2 |
| 1 | 3 |
| S | |
|---|---|
| C | D |
| 1 | 2 |
| 2 | 3 |
| R ∩ S | |
|---|---|
| A | B |
| 1 | 2 |
8. Kreuzprodukt (×)
Notation:
Das Kreuzprodukt (kartesisches Produkt) kombiniert jede Zeile von mit jeder Zeile von . Wenn Tupel und Tupel hat, enthält das Ergebnis Tupel. Das Ergebnis-Schema enthält alle Attribute beider Relationen.
Das Kreuzprodukt allein ist selten sinnvoll, weil es auch inhaltlich zusammenhanglose Kombinationen erzeugt. Es dient vielmehr als Grundbaustein für den Verbund (Join).| R | |
|---|---|
| A | B |
| 1 | 2 |
| 1 | 3 |
| S | |
|---|---|
| C | D |
| 1 | 2 |
| 2 | 3 |
| R × S | |||
|---|---|---|---|
| A | B | C | D |
| 1 | 2 | 1 | 2 |
| 1 | 2 | 2 | 3 |
| 1 | 3 | 1 | 2 |
| 1 | 3 | 2 | 3 |
9. Verbund / Join (⋈)
Theta-Join
Notation:
Der Verbund (englisch: Join) ist die wichtigste Operation zum Verknüpfen von Relationen. Ein Theta-Join ist im Wesentlichen ein Kreuzprodukt, auf das anschließend eine Selektion angewendet wird:
Die Bedingung kann ein beliebiger Vergleichsausdruck (, , , , , ) sein.
Mit der Punktnotation (R.A,S.A) können gleich benannte Attribute verschiedener Relationen angesprochen werden. Nur Tupel, für die in dem Wert in entspricht:
| R | |
|---|---|
| A | B |
| 1 | x |
| 2 | y |
| 3 | z |
| S | |
|---|---|
| A | B |
| 2 | 100 |
| 3 | 200 |
| 4 | 300 |
| R ⋈R.A=S.A S | |||
|---|---|---|---|
| R.A | R.B | S.A | S.B |
| 2 | y | 2 | 100 |
| 3 | z | 3 | 200 |
Natural Join (natürlicher Verbund)
Der Natural Join ( ohne Bedingung) verbindet automatisch über alle Attribute, die in beiden Relationen gleich benannt sind, und liefert dabei keine doppelten Spalten. Er ist besonders kompakt zu schreiben.
Verknüpft wird über das gleichnamige Attribut :
| X | |
|---|---|
| A | B |
| 1 | a |
| 2 | a |
| 3 | c |
| Y | |
|---|---|
| A | C |
| 1 | 3 |
| 2 | 2 |
| 1 | 2 |
| X ⋈ Y | ||
|---|---|---|
| A | B | C |
| 1 | a | 3 |
| 1 | a | 2 |
| 2 | a | 2 |
Mehrere gleichnamige Attribute ( und ) werden ebenfalls berücksichtigt. Nur Tupel, bei denen beide Werte übereinstimmen, landen im Ergebnis:
| U | ||
|---|---|---|
| A | B | C |
| 1 | a | 2 |
| 2 | a | 2 |
| 3 | c | 1 |
| V | ||
|---|---|---|
| A | C | D |
| 1 | 3 | a |
| 2 | 2 | b |
| 1 | 2 | c |
| U ⋈ V | |||
|---|---|---|---|
| A | B | C | D |
| 1 | a | 2 | c |
| 2 | a | 2 | b |
Zusammenfassung der Operatoren
¹AS ist kein eigenständiger Operator, sondern Syntax innerhalb von SELECT oder FROM.
| Operator | Symbol | Zweck | SQL |
|---|---|---|---|
| Selektion | Zeilen filtern | WHERE | |
| Projektion | Spalten auswählen | SELECT | |
| Umbenennung | Attribute/Relation umbenennen | AS ¹ | |
| Vereinigung | Zeilen zusammenführen | UNION | |
| Differenz | Zeilen subtrahieren | EXCEPT | |
| Schnittmenge | Gemeinsame Zeilen | INTERSECT | |
| Kreuzprodukt | Alle Kombinationen | CROSS JOIN | |
| Verbund | Verknüpfung nach Bedingung | JOIN |
Training: Operatoren anwenden
Gegeben seien drei Relationen , und :
| P | |
|---|---|
| A | B |
| a | c |
| b | c |
| c | f |
| Q | |
|---|---|
| B | C |
| c | f |
| e | g |
| c | g |
| T |
|---|
| C |
| f |
| g |
Berechne die folgenden Ausdrücke von Hand. Gib jeweils das vollständige Ergebnis als Relation an.
| (a) | (f) |
| (b) | (g) |
| (c) | (h) |
| (d) | (i) |
| (e) | (j) (Beschreibe die Operation in Worten.) |
Übungsaufgaben mit Schulschema
Die Übungsaufgaben in diesem Dokument beziehen sich auf das folgende Schema einer Schulverwaltung:
Primärschlüssel sind unterstrichen (SID) und Fremdschlüssel mit ↑ markiert (↑FID).- Schueler (SID, Name, Klasse)
- Fach (FID, Bezeichnung, Lehrkraft)
- Kurs (↑SID, ↑FID, Note)
| Schueler | ||
|---|---|---|
| SID | Name | Klasse |
| 1 | Amir | 12 |
| 2 | Lena | 12 |
| 3 | Jonas | 12 |
| 4 | Mia | 11 |
| 5 | Tobias | 11 |
| Fach | ||
|---|---|---|
| FID | Bezeichnung | Lehrkraft |
| 10 | Inf | Fr. Novak |
| 20 | Ma | Hr. Wagner |
| 30 | Eng | Fr. Petersen |
| Kurs | ||
|---|---|---|
| SID | FID | Note |
| 1 | 10 | 2 |
| 1 | 20 | 1 |
| 2 | 10 | 3 |
| 2 | 30 | 2 |
| 3 | 10 | 1 |
| 3 | 20 | 2 |
| 4 | 20 | 4 |
| 5 | 30 | 3 |
Training: Selektion und Projektion
Aufgabe 1 — Selektion und Projektion
- Formuliere einen Ausdruck der relationalen Algebra, der alle Kurse mit der Note 1 liefert.
- Formuliere einen Ausdruck, der nur die Namen aller Schülerinnen und Schüler ausgibt, ohne weitere Attribute.
- Welche Schülerinnen und Schüler befinden sich in der Klasse 11? Gib nur ihre Namen und SIDs aus.
Training: Verbund (Join)
Aufgabe 2 — Verbund (Join)
- Formuliere einen Ausdruck, der die Namen aller Schülerinnen und Schüler und die von ihnen erhaltenen Noten ausgibt.
- Erweitere den Ausdruck aus (1) so, dass auch die Bezeichnung des zugehörigen Faches mit ausgegeben wird.
- Welche Schülerinnen und Schüler (Name) werden von Fr. Novak unterrichtet?
Training: Mengenoperationen
Aufgabe 3 — Mengenoperationen (Ohne Verwendung von Join.)
- Formuliere einen Ausdruck, der die SIDs aller Schüler liefert, die Informatik (FID=10) oder Englisch (FID=30) belegen (oder beides).
- Welche Schüler (SID) belegen sowohl Informatik als auch Mathematik?
- Welche Schüler (SID) belegen Informatik, aber nicht Mathematik?
Training: Komplexe Anfragen
Aufgabe 4 — Komplexe Anfragen
- Gib die Namen aller Schülerinnen und Schüler aus der Klasse 12 aus, die in irgendeinem Fach die Note 1 erhalten haben.
- Gib für jeden Schüler, der Informatik belegt, dessen Namen und die zugehörige Note aus.
- Welche Lehrkräfte unterrichten Schülerinnen und Schüler aus der Klasse 12? Gib nur die Namen der Lehrkräfte aus.
Aufgabe 5
Gegeben sei folgende Erweiterung des Schemas:
- Raum (RID, Bezeichnung, Gebaeude)
- Unterricht (↑FID, ↑RID, Wochentag, Stunde)
- In welchen Räumen findet Informatikunterricht statt? Gib die Raumbezeichnungen aus.
- Formuliere einen Ausdruck, der alle Fächer ausgibt (Bezeichnung), die in Gebäude „B" unterrichtet werden.
- Welche Schülerinnen und Schüler (Name) belegen ein Fach, das montags () stattfindet?