Abfragen: Kartesisches Produkt
Betrachte die folgende Eisdielen-Datenbank, welche eine Tabelle mit Eisbehältern und eine Tabelle mit Eissorten enthält.
Indem mehrere Tabellen in der FROM
-Klausel notiert werden, werden diese zeilenweise kombiniert: Es wird das sogenannte kartesische Produkt gebildet.
SELECT * FROM behaelter, sorte
Manchmal erhalten durch Bildungs des kartesischen Produkts zwei Spalten denselben Namen. Wir können sie unterscheiden (Fachbegriff: „disambiguieren“), indem wir mit ursprungstabelle.spalte
angeben, aus welcher Tabelle die Spalte stammt. Die folgende Abfrage liefert bspw. alle Kombinationen aus Behältern und Sorten, die in einer Waffel serviert werden.
SELECT behaelter.name,
sorte.name
FROM behaelter, sorte
WHERE behaelter.name LIKE '%waffel'
Beachte, dass wir dann auch die Spalten noch umbennen können. Die gleiche Anfrage, aber mit umbenannten Spalten, lautet wie folgt.
SELECT behaelter.name AS verpackung,
sorte.name AS kugel
FROM behaelter, sorte
WHERE verpackung LIKE '%waffel'
Es können auch Relationen mit sich selbst „multipliziert“ werden. Z.B. liefert die folgende Abfrage alle Eisbestellungen mit drei Kugeln. Beachte, dass hierfür auch die Tabellen umbenannt werden − schließlich müssen die drei Eiskugeln voneinander unterscheidbar sein. Jeder „Faktor“ erhält einen eigenen Namen und diese Umbenennung erfolgt ebenfalls mittels AS
.
SELECT behaelter.name AS verpackung,
sorte_1.name AS kugel_1,
sorte_2.name AS kugel_2,
sorte_3.name AS kugel_3
FROM behaelter,
sorte AS sorte_1,
sorte AS sorte_2,
sorte AS sorte_3
Nun könnte man diese Abfrage verfeinern, indem man z.B. alle Bestellungen selektiert, die mindestens eine Kugel „Vanille“ enthalten und in einer Waffel serviert werden:
SELECT behaelter.name AS verpackung,
sorte_1.name AS kugel_1,
sorte_2.name AS kugel_2,
sorte_3.name AS kugel_3
FROM behaelter,
sorte AS sorte_1,
sorte AS sorte_2,
sorte AS sorte_3
WHERE (kugel_1 = 'Vanille'
OR kugel_2 = 'Vanille'
OR kugel_3 = 'Vanille')
AND verpackung LIKE '%waffel'
Es können sogar neue Spalten angelegt werden, deren Inhalt aus den Tabellendaten zeilenweise berechnet wird. Z.B. berechnet die folgende Anfrage noch den Preis für die gesamte Eisbestellung.
SELECT behaelter.name AS behaelter,
sorte_1.name AS kugel_1,
sorte_2.name AS kugel_2,
behaelter.preis + sorte_1.preis + sorte_2.preis
AS gesamtpreis
FROM behaelter,
sorte AS sorte_1,
sorte AS sorte_2
ORDER BY gesamtpreis