SQL-Anfragen über mehrere Tabellen
Betrachten wir einmal folgende Anfrage:
SELECT *
FROM Pizzaexemplar, Angestellter;
Was würde man als Ausgabe erwarten? Tatsächlich erhält man diese (umfangreiche)
Tabelle:
ID Pizzatyp Datum Uhrzeit Kun. Ang. Ang.ID Angestellter.Name Adresse Telefon Gehalt
2 Quattro Stagioni 23.08.2004 11:35:00 3 1 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
2 Quattro Stagioni 23.08.2004 11:35:00 3 1 2 Maximilian Bosch Florianstr. 6a 99112 Hamsterheim 01115/2138 1240,00
2 Quattro Stagioni 23.08.2004 11:35:00 3 1 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
2 Quattro Stagioni 23.08.2004 11:35:00 3 1 4 Tatjana Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2154 400,00
3 Calzone 23.08.2004 11:37:00 6 1 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
3 Calzone 23.08.2004 11:37:00 6 1 2 Maximilian Bosch Florianstr. 6a 99112 Hamsterheim 01115/2138 1240,00
3 Calzone 23.08.2004 11:37:00 6 1 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
3 Calzone 23.08.2004 11:37:00 6 1 4 Tatjana Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2154 400,00
4 Hawai 23.08.2004 11:50:00 2 1 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
4 Hawai 23.08.2004 11:50:00 2 1 2 Maximilian Bosch Florianstr. 6a 99112 Hamsterheim 01115/2138 1240,00
4 Hawai 23.08.2004 11:50:00 2 1 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
4 Hawai 23.08.2004 11:50:00 2 1 4 Tatjana Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2154 400,00
5 Quattro Stagioni 23.08.2004 12:03:00 5 3 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
5 Quattro Stagioni 23.08.2004 12:03:00 5 3 2 Maximilian Bosch Florianstr. 6a 99112 Hamsterheim 01115/2138 1240,00
5 Quattro Stagioni 23.08.2004 12:03:00 5 3 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
5 Quattro Stagioni 23.08.2004 12:03:00 5 3 4 Tatjana Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2154 400,00
7 Frutta di Mare 23.08.2004 12:07:00 4 3 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
7 Frutta di Mare 23.08.2004 12:07:00 4 3 2 Maximilian Bosch Florianstr. 6a 99112 Hamsterheim 01115/2138 1240,00
7 Frutta di Mare 23.08.2004 12:07:00 4 3 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
7 Frutta di Mare 23.08.2004 12:07:00 4 3 4 Tatjana Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2154 400,00
8 Frutta di Mare 23.08.2004 12:08:00 7 3 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
8 Frutta di Mare 23.08.2004 12:08:00 7 3 2 Maximilian Bosch Florianstr. 6a 99112 Hamsterheim 01115/2138 1240,00
8 Frutta di Mare 23.08.2004 12:08:00 7 3 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
8 Frutta di Mare 23.08.2004 12:08:00 7 3 4 Tatjana Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2154 400,00
Es werden alle Attribute ausgegeben und irgendwie findet eine Kombination der Tabellen
statt. Zur Verdeutlichung lassen wir in der gleichen Anfrage nur noch die IDs der
jeweiligen Tabelle ausgeben:
SELECT Pizzaexemplar.ID, Angestellter.ID
FROM Pizzaexemplar, Angestellter;
Pizzaexemplar.ID Angestellter.ID
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
4 1
4 2
4 3
4 4
5 1
5 2
5 3
5 4
7 1
7 2
7 3
7 4
8 1
8 2
8 3
8 4
Die Ergebnismenge ist eine Kombination der Datensätze beider Tabellen. In ihr
wird jedem Datensatz der Tabelle "Pizzaexemplar" jeder Datensatz der Tabelle
"Angestellter" zugeordnet.
Eine Mengenoperation, bei der jedem Element der
einen Menge jedes Element der anderen Menge zugeordnet wird, heißt Kreuzmenge.
Die Anzahl der entstehenden kombinierten Datensätze ist das Produkt der
Datensätze aus Tabelle 1 und Tabelle 2.
Solche Kreuzmengen verwendet man z.B. auch in der Stochastik um sämtliche
Ergebnisse eines Münzwurfs, kombiniert mit einem Würfelwurf zu erhalten:
- Münzwurf: {K, Z}
- Würfel: {1, 2, 3, 4, 5, 6}
- Kombination: {K1, K2, K3, K4, K5, K6, Z1, Z2, Z3, Z4, Z5, Z6}
Warum bietet die Datenbank diese Kreuzmenge als Ergebnis an?
Die Software soll die Kombination zwischen den Datensätzen nicht einschränken,
sie ist dumm. Welche Information unter allen Kombinationen eine Rolle spielt
muss der Benutzer bestimmen. Diesen Vorgang nennt man Selektion (Auswahl).
Die Ergebnismenge einer Anfrage über zwei Tabellen entspricht also erstmal
der Komination aller Datensätze miteinander. Um ein sinnvolles Ergebnis zu
erhalten wählt man aus dieser Menge Kombinationen aus, die in den Fremd- und
Primärschlüsseln übereinstimmen:
SELECT *
FROM Pizzaexemplar, Angestellter
WHERE Pizzaexemplar.Angestellter = Angestellter.ID;
ID Pizzatyp Datum Uhrzeit Kun. Ang. Ang.ID Ang.Name Adresse Telefon Gehalt
2 Quattro Stagioni 23.08.2004 11:35:00 3 1 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
3 Calzone 23.08.2004 11:37:00 6 1 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
4 Hawai 23.08.2004 11:50:00 2 1 1 Florian Huber Asamstr. 16 99110 Börishofen 01110/1357 1240,00
5 Quattro Stagioni 23.08.2004 12:03:00 5 3 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
7 Frutta di Mare 23.08.2004 12:07:00 4 3 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
8 Frutta di Mare 23.08.2004 12:08:00 7 3 3 Felix Rethuber Sinkubanstr. 1 99112 Hamsterheim 01115/2138 1800,00
Dieses SQL-Statement entspricht der Frage, wer welches Pizzaexemplar als Bestellung entgegengenommen
hat. Kürzer lautet es dann so: