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