Alle Tabs der Lerneinheit (Erklärung · RA-Lab · Praxis-Übung · Klausur-Quiz) als durchgehender Text. Ideal zum Wiederholen vor der Klausur, und für Suchmaschinen wie Google, Bing und KI-Suche (ChatGPT, Perplexity).
Erklärung
SQL ist nur eine Sprache, die mathematische Grundlage dahinter heißt Relationale Algebra. Mit 5 Grundoperatoren kannst du jede SQL-Query ausdrücken. Klausur-Klassiker: gegebene Tabellen + Frage in natürlicher Sprache → übersetze in einen RA-Ausdruck. In 11/12 WInf-DB-Klausuren Pflicht.
Wir gehen die Operatoren systematisch durch, jeden mit einem konkreten Beispiel auf zwei Mini-Tabellen.
Die zwei Demo-Tabellen
Studierende:
| MatrNr | Name | Semester |
|---|---|---|
| 1001 | Müller | 3 |
| 1002 | Schulz | 5 |
| 1003 | Klein | 3 |
Belegungen:
| MatrNr | KursID | Note |
|---|---|---|
| 1001 | DB1 | 2,3 |
| 1001 | INF | 1,7 |
| 1002 | DB1 | 2,7 |
Die 5 Grundoperatoren
1. Selektion σ (Sigma), "Zeilen filtern"
σ_([Bedingung](/themen/bedingungen))(R), wähle alle Zeilen ausR, die die Bedingung erfüllen.
SQL-Äquivalent: WHERE.
Beispiel: σ_(Semester = 3)(Studierende) liefert alle Studi im 3. Semester:
| MatrNr | Name | Semester |
|---|---|---|
| 1001 | Müller | 3 |
| 1003 | Klein | 3 |
2. Projektion π (Pi), "Spalten wählen"
π_(A, B, ...)(R), wähle nur die SpaltenA, B, ...ausR. Duplikate werden automatisch entfernt.
SQL-Äquivalent: SELECT DISTINCT.
Beispiel: π_(KursID)(Belegungen) liefert alle belegten Kurse (ohne Duplikate):
| KursID |
|---|
| DB1 |
| INF |
3. Natürlicher Join ⋈ (bowtie), "Tabellen über gleichnamige Spalten verbinden"
R bowtie S, verbindet Zeilen ausRundS, bei denen die gleichnamigen Spalten dieselben Werte haben.
SQL-Äquivalent: INNER JOIN ... USING oder NATURAL JOIN.
Beispiel: Studierende bowtie Belegungen (Join über MatrNr):
| MatrNr | Name | Semester | KursID | Note |
|---|---|---|---|---|
| 1001 | Müller | 3 | DB1 | 2,3 |
| 1001 | Müller | 3 | INF | 1,7 |
| 1002 | Schulz | 5 | DB1 | 2,7 |
Klein taucht nicht auf, keine Belegung. (Wenn er auftauchen sollte, brauchst du einen Outer-Join, der in der Standard-RA nicht enthalten ist.)
4. Vereinigung ∪, "Zeilen aus beiden zusammen"
R ∪ S, alle Zeilen ausRund alle ausS, Duplikate weg. Bedingung: beide Relationen sind schema-kompatibel (gleiche Spalten, gleiche Typen).
SQL-Äquivalent: UNION.
Beispiel: σ_(Sem=3)(Stud) ∪ σ_(Sem=5)(Stud), Studi aus Semester 3 oder 5.
5. Differenz −, "Zeilen die in R aber nicht in S"
R - S, alle Zeilen ausR, die nicht inSsind. Auch schema-kompatibel.
SQL-Äquivalent: EXCEPT (PostgreSQL) oder MINUS (Oracle).
Beispiel: π_(MatrNr)(Stud) - π_(MatrNr)(Belegungen), Studi ohne Belegung:
| MatrNr |
|---|
| 1003 |
Zusatz-Operator: Kartesisches Produkt ×
R × S, jede Zeile ausRwird mit jeder Zeile ausSkombiniert. Sehr groß, selten direkt sinnvoll.
SQL-Äquivalent: CROSS JOIN oder FROM R, S ohne WHERE.
Wird meistens zusammen mit Selektion benutzt: σ_(R.MatrNr = S.MatrNr)(R × S) ist äquivalent zum natürlichen Join. Der natürliche Join ist also nur eine Abkürzung.
Visualisierung
Probier die Operatoren live aus, wähle eine Tabelle, einen Operator, dann den Parameter:
Interaktive Visualisierung
Interaktive Komponente: probiere sie im Topic-Player oben aus.
Komplexe Ausdrücke kombinieren
In der Klausur kommst du selten mit nur einem Operator aus. Du schachtelst Operatoren wie Funktionen.
Aufgabe: "Gib die Namen aller Studi im 3. Semester aus, die DB1 belegt haben."
Schritte:
- Belegungen auf DB1 filtern:
σ_(KursID='DB1')(Belegungen) - Mit Studi joinen:
Stud bowtie σ_(KursID='DB1')(Belegungen) - Auf Semester 3 filtern:
σ_(Semester=3)(Stud bowtie σ_(KursID='DB1')(Belegungen)) - Namen projizieren:
π_(Name)(σ_(Semester=3)(Stud bowtie σ_(KursID='DB1')(Belegungen)))
Ergebnis: Müller.
Klausur-Trick: Selektion so früh wie möglich (Push-Down), filtert Zeilen aus bevor sie in Joins landen. Macht den Ausdruck effizienter und ist Anfrageoptimierungs-Klassiker.
Klausur-Faustregeln
- 5 Grundoperatoren auswendig: σ, π, ⋈, ∪, − (+ optional × ohne Bedingung).
- SQL-Mapping: σ = WHERE, π = SELECT DISTINCT, ⋈ = INNER JOIN ... USING, ∪ = UNION, − = EXCEPT.
- Schachtelung von innen nach außen lesen. Wie bei verschachtelten Funktionen.
- Vereinigung und Differenz nur schema-kompatibel. Beide Relationen müssen dieselben Spalten haben.
- Klausur-Übersetzungsschema: natürliche Sprache → identifiziere "Welche Zeilen?" (σ) und "Welche Spalten?" (π) und "Welche Verknüpfungen?" (⋈).
Typische Stolpersteine
1. Selektion auf Spalten wenden, Projektion auf Zeilen. Umgekehrt! σ filtert Zeilen (WHERE), π filtert Spalten (SELECT).
2. Outer-Joins existieren nicht in Standard-RA. Wenn die Klausur einen Outer-Join verlangt, musst du es über ∪ und einen Hilfs-Ausdruck mit NULL-Tupeln konstruieren. In erweiterten RAs (z.B. SQL-RA) gibt es ⟕ und ⟖.
3. Natürlicher Join verbindet automatisch gleichnamige Spalten. Wenn du in Tabellen verschiedene Namen für die Verbindungs-Spalte hast, brauchst du erst Umbenennung (ρ, rho) oder den Theta-Join R bowtie_(θ) S mit expliziter Bedingung.
4. Duplikat-Eliminierung bei Projektion. π entfernt Duplikate automatisch (RA-Semantik), SQL nicht (SELECT ohne DISTINCT lässt Duplikate). In Klausuren immer in RA-Semantik denken.
RA-Lab
RA-Lab, Operatoren live anwenden
Wähle einen Operator, gib die Parameter ein (Bedingung bei σ, Spalten bei π, Tabellen bei Join), und sieh das Ergebnis als Tabelle. Anschließend kannst du den Ausdruck schachteln, das Ergebnis einer Operation wird zur Eingabe der nächsten.
Lern-Tipp: Geh die Beispiel-Aufgaben durch (im Visualizer wählbar): "Wer hat DB1 belegt?", "Welche Kurse sind belegt?", "Wer hat keinen Kurs belegt?", alle drei lassen sich mit 1–3 RA-Operatoren ausdrücken.
Interaktive Visualisierung
Interaktive Komponente: probiere sie im Topic-Player oben aus.
Praxis-Übung
Relationale Algebra, Praxis-Übung
Vier Aufgaben-Typen: Operator-Identifikation, RA → SQL, einfache Ausdruck-Auswertung, schema-kompatible Operatoren.
Klausurfragen mit Lösungen (6)
- F1.Welcher RA-Operator entspricht dem SQL-WHERE?
Antwort: σ (Selektion)
Erklärung: σ filtert Zeilen anhand einer Bedingung, genau wie WHERE in SQL. π wäre SELECT DISTINCT (Spalten-Auswahl), ⋈ entspricht INNER JOIN, ∪ entspricht UNION.
- F2.Was bewirkt π_{Name}(σ_{Note < 2,0}(Belegungen))?
Antwort: Alle Namen, deren Note unter 2,0 liegt
Erklärung: Von innen nach außen: σ filtert Zeilen mit Note < 2,0, π wählt nur die Spalte Name. Resultat: Liste aller Namen mit guter Note (Duplikate weg).
- F3.Welche RA-Operatoren brauchen schema-kompatible Eingangs-Relationen?
Richtige Antworten: ∪ (Vereinigung); − (Differenz)
Erklärung: Vereinigung und Differenz brauchen gleiche Schemata (gleiche Spaltennamen + Typen). Alle anderen Operatoren arbeiten auf beliebigen Relationen. ⋈ verbindet über gleichnamige Spalten, das ist eine 'überlappendes Schema'-Anforderung, aber keine volle Schema-Gleichheit.
Typ: Multi-Select
- F4.Tabelle Studi(MatrNr, Name, Sem). Welcher RA-Ausdruck liefert die Namen aller Studierenden im 3. Semester?
Antwort: π_{Name}(σ_{Sem=3}(Studi))
Erklärung: Erst Zeilen filtern (σ_{Sem=3}), dann Spalten wählen (π_{Name}). Reihenfolge wichtig: σ vor π ist effizienter (weniger Daten in der Projektion) und in dieser Aufgabe semantisch nötig (Name allein ohne Sem-Info hätte den Filter nicht).
- F5.Ordne den RA-Operator dem SQL-Konstrukt zu:
Zuordnungen:
- σ → WHERE
- π → SELECT DISTINCT
- ⋈ → NATURAL JOIN / INNER JOIN USING
- ∪ → UNION
Erklärung: Die Standard-Zuordnung zwischen RA-Operatoren und SQL-Konstrukten. SQL ist um zusätzliche Features (ORDER BY, GROUP BY, NULLS) erweitert, die nicht direkt in der RA stehen, diese sind in der erweiterten RA mit Aggregations- und Sortier-Operatoren ausgedrückt.
Typ: Zuordnung
- F6.Der natürliche Join R⋈S verbindet automatisch Zeilen über alle gleichnamigen Spalten in R und S.
Antwort: Wahr
Erklärung: Wahr. Genau das ist der Sinn: ⋈ schaut nach gleichnamigen Spalten und matcht Zeilen, wo die Werte übereinstimmen. Wenn R und S keine gleichnamigen Spalten haben, wird ⋈ zum Kartesischen Produkt × (jede Zeile mit jeder).
Typ: Wahr/Falsch
Klausur-Quiz
Klausurfragen mit Lösungen (6)
- F1.Welcher RA-Ausdruck liefert MatrNr von Studi, die KEINEN Kurs belegt haben? Tabellen: Studi(MatrNr,...) und Beleg(MatrNr, KursID, ...)
Antwort: π_{MatrNr}(Studi) − π_{MatrNr}(Beleg)
Erklärung: Differenz braucht schema-kompatible Relationen. Beide auf MatrNr projizieren, dann Differenz. 'Studi − Beleg' direkt geht nicht (Schemas unterschiedlich). σ mit NULL ist SQL-spezifisch, nicht Standard-RA.
- F2.Welcher RA-Ausdruck entspricht dieser SQL-Query? SELECT Name FROM Stud JOIN Beleg USING (MatrNr) WHERE KursID = 'DB1';
Antwort: π_{Name}(σ_{KursID='DB1'}(Stud ⋈ Beleg))
Erklärung: Standard-Übersetzung: erst joinen, dann WHERE-Filter (σ), dann Spalten wählen (π). Klammern lesen von innen nach außen: Stud⋈Beleg → σ → π. Variante 3 könnte auch funktionieren mit Selektions-Push-Down (Optimierung), ist aber semantisch nicht ganz identisch.
- F3.Bei π_{Name}(Studi) werden Duplikate automatisch entfernt, auch wenn zwei Studi denselben Namen haben.
Antwort: Wahr
Erklärung: Wahr. RA-Semantik: π entfernt immer Duplikate (Set-Semantik). In SQL ist das anders: 'SELECT Name' liefert Duplikate, 'SELECT DISTINCT Name' nicht. RA = SELECT DISTINCT.
Typ: Wahr/Falsch
- F4.Sortiere für 'Welche Studi im 3. Sem haben DB1?' den effizientesten RA-Ausdruck (Selektionen früh):
Richtige Reihenfolge:
- σ_{Sem=3}(Stud)
- σ_{KursID='DB1'}(Beleg)
- Resultat von Schritt 1 ⋈ Resultat von Schritt 2
- π_{Name}(...)
Erklärung: Selektion-Push-Down: filtere ZUERST beide Eingabe-Tabellen separat, joine dann die kleineren Zwischen-Ergebnisse, am Ende projiziere. Das ist die Grundregel der Anfrageoptimierung, in Welle 8.8 vertiefen wir das.
Typ: Reihenfolge
- F5.Welcher RA-Ausdruck ist ÄQUIVALENT zu R ⋈ S, wenn R und S über die Spalte K verbunden werden?
Antwort: σ_{R.K=S.K}(R × S)
Erklärung: Der natürliche Join ist eine Abkürzung für 'Kartesisches Produkt + Selektion über die gemeinsamen Spalten'. R ⋈ S = σ_{R.K=S.K}(R × S), gefolgt von Projektion (Entfernung der doppelten K-Spalte). Das ist die formale Definition.
- F6.Die {{1}} filtert Zeilen, die {{2}} filtert Spalten. Bei beiden gilt das Ergebnis ist wieder eine Relation. Die {{3}} verbindet zwei Relationen über gleichnamige Spalten.
Lösungen pro Lücke:
- {{1}}: Selektion / σ
- {{2}}: Projektion / π
- {{3}}: natürliche Join / Natural Join / Join / ⋈
Erklärung: Die zwei Filter-Operatoren (Zeilen/Spalten) plus der Verknüpfungs-Operator sind das 80 %-Werkzeug der RA. Wenn du diese drei sicher beherrschst, deckst du fast alle Klausur-Aufgaben ab.
Typ: Lückentext