Relationale Algebra
Die Relationenalgebra oder relationale Algebra stellt Methoden zur
Verfügung, mit denen sich Relationen manipulieren lassen. Sie ermöglicht es,
Relationen zu filtern, zu verknüpfen, zu aggregieren oder anderweitig zu
modifizieren, um Anfragen an eine Datenbank zu formulieren. Um
Mengenoperationen auf den Relationen R und S durchführen zu können, müssen
beide miteinander kompatibel sein. Diese Kompatibilität zweier Relationen
ist gegeben, wenn A und B die gleiche Anzahl von Attributen haben und
der Wertebereich der Attribute von A und B identisch ist.
Mit Hilfe der beiden folgenden Tabellen sollen die
Operationen Durchschnitt, Vereinigung und Differenz erklärt
werden:
A |
B |
C |
|
A |
B |
C |
1 |
2 |
3 |
|
4 |
5 |
6 |
4 |
5 |
6 |
|
7 |
8 |
9 |
Die Vereinigung A ∪ B zweier Relationen A und B ist die Menge aller Tupel, die in A oder B oder in beiden Relationen enthalten sind.
Definition: A ∪ B := {t|t∈A ∨ t∈B}
Die erzeugte Relation ist
Der Durchschnitt A ∩ B zweier Relationen A und B ist die
Menge aller Tupel, die sowohl in A als auch in B enthalten
sind.
Definition: A ∩ B := {t|t∈A ∧ t∈B}
Die erzeugte Relation ist
Die Differenz A \ B zweier Relationen A und B ist die Menge aller Tupel, die in A aber nicht gleichzeitig in B enthalten sind.
Definition: A \ B := {t|t∈A ∧ t∉B}
Die erzeugte Relation ist
Zwei weitere relationale Operationen sind die Projektion und die Selektion.
Die Projektion entspricht der Projektionsabbildung aus der Mengenlehre und kann
auch Attributbeschränkung genannt werden. Sie extrahiert einzelne Attribute aus
der ursprünglichen Attributmenge und ist somit als eine Art Selektion auf
Spaltenebene zu verstehen, das heißt, die Projektion blendet Spalten aus. Wenn β
die Attributliste ist, schreibt man πβ(R). β heißt auch Projektionsliste.
Duplikate in der Ergebnisrelation werden eliminiert.
Definition: A sei eine Relation über {A1, …, Ak}
und β ⊆ {A1, …, Ak}.
π β ( A ) := { t β | t ∈ A }
R: |
|
R[A,B]: |
|
R[A]: |
A |
B |
C |
|
A |
B |
|
A |
1 |
2 |
3 |
|
1 |
2 |
|
1 |
4 |
5 |
6 |
|
4 |
5 |
|
4 |
1 |
3 |
8 |
|
1 |
3 |
|
|
Die Selektion liefert die Teilmenge aller Tupel einer
Relation A, die eine Formel F erfüllen.
Definition: σAusdruck(A)
:= {t|t ∈ A ∧ t erfüllt Ausdruck)
R: |
|
R[A=1]: |
|
|
R[C>6]: |
A |
B |
C |
|
A |
B |
C |
|
A |
B |
C |
1 |
2 |
4 |
|
1 |
2 |
4 |
|
4 |
6 |
7 |
4 |
6 |
7 |
|
1 |
6 |
7 |
|
1 |
6 |
7 |
1 |
6 |
7 |
|
|
|
|
|
|
|
|
8 |
6 |
1 |
|
|
|
|
|
|
|
|
Kartesisches Produkt
Das kartesische Produkt A x B ist die Menge aller (n1 * n2)-Tupel, die durch Kombination der Tupel aus A mit den Tupeln aus B entstehen.
A: |
|
B: |
|
A X B |
A |
B |
C |
D |
|
E |
F |
G |
|
A |
B |
C |
D |
E |
F |
G |
1 |
2 |
3 |
4 |
|
1 |
2 |
3 |
|
1 |
2 |
3 |
4 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
7 |
8 |
9 |
|
4 |
5 |
6 |
7 |
1 |
2 |
3 |
7 |
8 |
9 |
0 |
|
|
|
|
|
7 |
8 |
9 |
0 |
1 |
2 |
3 |
|
|
|
|
|
|
|
|
|
1 |
2 |
3 |
4 |
7 |
8 |
9 |
|
|
|
|
|
|
|
|
|
4 |
5 |
6 |
7 |
7 |
8 |
9 |
|
|
|
|
|
|
|
|
|
7 |
8 |
9 |
0 |
7 |
8 |
9 |
Natural-Join
Als erstes wird das kartesische Produkt gebildet. Dann
erfolgt die Selektion mit der Bedingung, dass der Inhalt
bestimmter Spalten identisch sein muss. Anschließend wird
die duplizierte Spalte gelöscht.
A X B |
|
JOIN
(A,A.A=B.E,B) |
|
Natural Join
(A,B) |
A |
B |
C |
D |
E |
F |
G |
|
A |
B |
C |
D |
E |
F |
G |
|
A |
B |
C |
D |
F |
G |
1 |
2 |
3 |
4 |
1 |
2 |
3 |
|
1 |
2 |
3 |
4 |
1 |
2 |
3 |
|
1 |
2 |
3 |
4 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
2 |
3 |
|
7 |
8 |
9 |
0 |
7 |
8 |
9 |
|
7 |
8 |
9 |
0 |
8 |
9 |
7 |
8 |
9 |
0 |
1 |
2 |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
2 |
3 |
4 |
7 |
8 |
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
5 |
6 |
7 |
7 |
8 |
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
8 |
9 |
0 |
7 |
8 |
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Übungsbeispiele:
1. Die folgenden relationalen Operationen sollen
durchgeführt und die Ergebnistabellen erstellt werden.
Ausgangsrelationen sind die folgenden drei Tabellen:
Tabelle 1 |
|
Tabelle 2 |
|
Tabelle 3 |
A |
B |
C |
|
C |
D |
|
B |
E |
4 |
2 |
8 |
|
8 |
2 |
|
5 |
3 |
2 |
2 |
1 |
|
3 |
6 |
|
4 |
4 |
6 |
7 |
3 |
|
|
|
|
5 |
4 |
a) Selektion von Tabelle 1 mit der Bedingung B=2
b) Projektion von Tabelle 3 auf E.
c) Join Tabelle 1 und Tabelle 2 nach dem gemeinsamen
Attribut C
d) Selektion von Tabelle 1 mit B>C vereinigt mit
Selektion von Tabelle 1 mit A>5
Lösung:
a) σB=2(Tabelle1)
b) πE(Tabelle3) c) Tabelle1 ⋈C=C Tabelle2
d) σB>C(Tabelle1) ∪ σA<5(Tabelle1)
a) |
|
b) |
|
c) |
|
d) |
A |
B |
C |
|
E |
|
A |
B |
C |
D |
|
A |
B |
C |
4 |
2 |
8 |
|
3 |
|
4 |
2 |
8 |
2 |
|
4 |
2 |
8 |
2 |
2 |
1 |
|
4 |
|
6 |
7 |
3 |
6 |
|
2 |
2 |
1 |
|
|
|
|
|
|
|
|
|
|
|
6 |
7 |
3 |
2. Gegeben sind folgende Relationen (# ist das Zeichen
für Nummer):
LIEFERANTEN (L#, LName, Status, Stadt1)
TEILE (T#, TName, Farbe, Gewicht, Stadt2)
PROJEKTE (P#,
PName, Stadt3)
LIEFERUNGEN (L#, T#, P#, Anzahl)
a)
Gesucht werden alle Lieferungen mit Anzahlen zwischen 300
und 750.
b) Gesucht werden alle Städte, in denen
Lieferanten sitzen.
c) Gesucht werden alle vorkommenden
Paarungen TName und Stadt2 aus.
d) Gesucht werden
alle schwarzen Teile. Die Nummern und Namen sollen
ausgegeben werden.
e) Gesucht werden alle Lieferanten,
die in einer Einzellieferung mehr als 150 Teile geliefert
haben.
Lösung:
a) σAnzahl>=300 und Anzahl<=750(Lieferungen)
b) πStadt1(Lieferanten)
c) πTName,Stadt2(Teile)
d) πT#,Stadt2(σ Farbe=schwarz(Teile))
e) πLname(π L#(σAnzahl>150(Lieferungen))⋈πL#,Lname(Lieferanten))
3. Die folgenden drei Relationen sind gegeben:
Schüler |
|
SchülerID |
Name |
Vorname |
Tutor |
Geschlecht |
123 |
Alberti |
Hans |
Müller |
m |
034 |
Glücklich |
Gesine |
Abel |
w |
321 |
Müser |
Angelika |
Abel |
w |
111 |
Weber |
Wolfgang |
Zange |
m |
|
|
|
|
|
Kurs |
|
KursID |
Typ |
Fach |
Thema |
Stufe |
13 |
Gk |
Mathematik |
Analysis 2 |
12/I |
11 |
Gk |
Physik |
Mechanik 1 |
11/I |
03 |
Gk |
Informatik |
Datenbanken |
12/II |
25 |
Lk |
Englisch |
Shirt
Stories |
12/I |
89 |
Gk |
Informatik |
Compilerbau |
13/II |
Besucht |
SchülerID |
KursID |
Fehlstunden |
Punkte |
123 |
03 |
00 |
12 |
123 |
25 |
03 |
07 |
321 |
89 |
00 |
14 |
111 |
03 |
21 |
03 |
a) Das ER-Diagramm soll erstellt werden.
b) Welche Tabelle liefert
πKursID(σFach=Informatik(Kurs))? Diese neue Tabelle heißt
Informatikkurse.
c) Die Tabelle Informatikschüler wird durch den Join
Informatikkurse ⋈ Besucht erzeugt. Wie sieht diese aus?
d) Es sollen die notwendigen Relationen-Operatoren
bestimmt und begründet werden, um von der Tabelle
Informatikschüler auf die Tabelle
InformatikschülerPunkteNamen zu gelangen.
InformatikschülerPunkteNamen |
SchülerID |
Punkte |
Name |
Vorname |
Tutor |
Geschlecht |
123 |
12 |
Alberti |
Hans |
Müller |
m |
111 |
03 |
Weber |
Wolfgang |
Zange |
m |
321 |
14 |
Müser |
Angelika |
Abel |
w |
e) Es soll der Relationen-Operator angegeben werden, um
von der Tabelle InformatikschülerPunkteNamen auf eine
Tabelle zu gelangen, welche nur die Namen und Punkte der
männlichen Informatikschüler enthält, die mindestens eine
"zwei" (10-15Punkte) in Informatik haben.
Lösungen:
Informatikschüler |
KursID |
SchülerID |
Fehlstunden |
Punkte |
03 |
123 |
00 |
12 |
89 |
321 |
00 |
14 |
πSchülerId,Punkte(Informatikschüler ⋈ Schüler)
πPunkte,Name,Vorname(σPunkte>=12 ∧
Geschlecht="m"(InformatikschülerPunkteNamen))
SQL-Befehle
Die Syntax eines Standard-Select-Befehls in BNF
(Backus-Naur-Form) sieht wie folgt aus:
SELECT [ALL|DISTINCT]{spalten|*}
FROM Tabelle [alias]
[Tabelle[alias]]...
[WHERE {bedingung|unterabfrage}]
[GROUP BY spalten[HAVING {bedingung|unterabfrage}]]
[ORDER BY spalten[ASC|DESC]...];
Für die folgenden Beispiele werden die drei Relationen
Student (MatrNr, Name), Vorlesung (VorlNr, Titel, PersNr),
Professor (PersNr, Name) und die beiden Beziehungsrelationen
hört (MatrNr, VorlNr) und liest (PersNr, VorlNr) verwendet.
SELECT *
from Student;
listet alle Spaten und Zeilen aus der Tabelle Student
auf.
SELECT *
FROM Student
WHERE (MatrNr LIKE "156-*")
OR (Name LIKE "Ab*");
listet alle Studenten der Tabelle Student auf, deren
MatrNr mit "156-" beginnt oder deren Namen mit "Ab" beginnt.
SELECT MatrNr
FROM Student;
listet die Spalte MatrNr der Tabelle Student auf.
SELECT DISTINCT MatrNr
FROM hört;
listet nur unterschiedliche Einträge der Spalte MatrNr
aus der Tabelle hört auf. Dies zeigt die Matrikelnummern
aller Studenten, die mindestens eine Vorlesung hören, wobei
mehrfach auftretende Matrikelnummern nur einmal ausgegeben
werden.
SELECT Name, MatrNr AS Matrikelnummer
FROM Student;
Die Spalte MatrNr heißt in der Ergebnisrelation jetzt
Matrikelnummer.
SELECT Titel, VorlNr
FROM Vorlesung
WHERE PersNr =
12;
listet alle Vorlesungen des Professors mit der
Personalnummer 12 auf.
SELECT Titel, VorlNr FROM Vorlesung ORDER BY PersNr;
listet alle Vorlesungs-Titel sortiert nach
unterrichtenden Professoren auf.
SELECT Vorlesung.VorlNr, Vorlesung.Titel,
Professor.PersNr, Professor.Name
FROM Professor,
Vorlesung
WHERE Professor.PersNr = Vorlesung.PersNr;
Dies ist äquivalent zu:
SELECT Vorlesung.VorlNr,
Vorlesung.Titel, Professor.PersNr, Professor.Name
FROM
Professor INNER JOIN Vorlesung
ON Professor.PersNr =
Vorlesung.PersNr;
listet die Werte der Spalten VorlNr und Titel aus der
Tabelle Vorlesung sowie der Spalten Name und Persnr aus der
Tabelle Professor für alle Vorlesungen auf.
SELECT Vorlesung.VorlNr, Vorlesung.Titel, Professor.Name,
Professor.PersNr FROM Professor
LEFT OUTER JOIN
Vorlesung ON Professor.PersNr = Vorlesung.PersNr;
Äußerer linker natürlicher Verbund: Listet die Werte der
Spalten VorlNr und Titel aus der Tabelle Vorlesung sowie der
Spalten Name und PersNr aus der Tabelle Professor für alle
Vorlesungen auf. Professoren die keine Vorlesungen halten
werden auch mit aufgelistet.
SELECT Professor.Name, Professor.PersNr
FROM Professor
LEFT OUTER JOIN Vorlesung ON Professor.PersNr =
Vorlesung.PersNr
WHERE Vorlesung.PersNr IS NULL
Äußerer linker natürlicher Verbund, Selektion und
Projektion: Listet alle Professoren auf, die keine
Vorlesungen halten. Die Abfrage ist identisch mit der
folgenden (Unterabfrage mit Existenz-Quantor):
SELECT Professor.Name, Professor.PersNr
FROM Professor
WHERE NOT EXISTS (SELECT * FROM Vorlesung WHERE PersNr =
Profeesor.PersNr);
SELECT COUNT(Vorlesung.PersNr) AS Anzahl,
Professor.PersNr, Professor.Name
FROM Professor LEFT
OUTER JOIN Vorlesung
ON Professor.PersNr =
Vorlesung.PersNr
GROUP BY Professor.Name,
Professor.PersNr;
Gruppierung, Aggregation und äußerer linker natürlicher
Verbund: Zählt die Anzahl der Vorlesungen pro Professor.
Bemerkung: COUNT(Professor.PersNr) oder COUNT(*) wären
falsch (Nullwerte sollen nicht mitgezählt werden).
Für das nächste Beispiel werden die Relationen Landgang
(LandgangID,Dauer, OrtID, Bezeichnung), Ort (OrtID,
Ortsname, Staat) und Sehenswürdigkeit (SehenswürdikeitID,
OrtID, Beschreibung, Dauer) genutzt.
Gesucht sind die Staaten der Orte, an denen ein Landgang
der Kreuzfahrtroute mit der ID 'A' stattfindet. Jeder Staat
soll nur einmal aufgeführt werden.
SELECT DISTINCT Staat
FROM Ort JOIN Landgang
ON
Landgang.OrtID = Ort.OrtID
WHERE Landgang.RouteID = 'A';
Gesucht sind für alle Orte der Ortsname und die folgende
Informationen: die Anzahl der Sehenswürdigkeiten an dem Ort
und die Gesamtdauer, die für den Ort benötigt wird, um alle
Sehenswürdigkeiten zu besichtigen.
SELECT Ortsname, COUNT(SehenswuerdigkeitID) AS Anzahl,
SUM(Dauer) AS Gesamtdauer
FROM Ort JOIN Sehenswuerdigkeit
ON Ort.OrtID = Sehenswuerdigkeit.OrtID
GROUP BY Ort.OrtID
Gesucht sind die Ortsnamen, an denen keine Landgänge
verzeichnet sind.
SELECT Ortsname
FROM Ort
WHERE OrtID NOT IN (SELECT
OrtID FROM Landgang);
Zu welchen Ergebnissen führen die folgenden Anfragen:
SELECT Bezeichnung, Dauer
FROM Landgang
WHERE RouteID
= 'A'
ORDER BY Nummer
Gesucht sind die Bezeichnung und Dauer der Landgänge,
deren Route die ID 'A' hat. Die Daten sind nach der Nummer
des Landgangs sortiert. Es handelt sich also um eine
Auflistung der geplanten Landgänge der Route A in der
Reihenfolge, in der sie stattfinden sollen.
SELECT RouteID, COUNT(*) AS Anzahl
FROM Landgang
GROUP BY RouteID
Gesucht werden die RouteID der Relation Landgang, ergänzt
um eine mit "Anzahl" bezeichnete Spalte. Die Datensätze
werden nach dem Attribut RouteID gruppiert und in der
Ergebnisspalte Anzahl wird die Anzahl der Datensätze in der
jeweiligen Gruppe ermittelt. Es handelt sich also um eine
Auflistung der Routen und die jeweilige Anzahl der
Landgänge.
SELECT Beschreibung, Ortsname
FROM Sehenswuerdigkeit
JOIN Ort ON Sehenswuerdigkeit.OrtID = Ort.OrtID
JOIN
Landgang ON Landgang.OrtID = Ort.OrtID
WHERE RouteID =
'A';
Gesucht ist eine Auflistung aller Orte mit
Sehenswürdigkeiten der Route A.