SQL stellt eine Reihe von Mengenoperationen zur Verfügung, die für die tägliche Arbeit mit dem System von entscheidender Bedeutung sind. Wollen wir beispielsweise die Ergebnisse von mehreren SQL-Statements in einem Ergebnis vereinen, können wir das Schlüsselwort UNION verwenden:
test=# SELECT name, price
FROM t_produkt
UNION SELECT 'Summe: ' AS name, SUM(price)
FROM t_produkt
ORDER BY price;
name | price
--------------+--------
Apfel | 0.45
Semmel | 1
Käsestangerl | 2
Rose | 2.16
Kasten | 216
Summe: | 221.61
(6 rows)
In diesem Fall haben wir die Liste der Produkte und deren Gesamtpreis ausgegeben. Um den Datenbestand nach dem Preis zu sortieren, müssen wir ans Ende der Query eine ORDER BY Clause einfügen.
Wichtig ist, dass Sie das ORDER BY am Ende des Statements einfügen, da es für den gesamten Datenbestand gilt:
test=# SELECT name, price FROM t_produkt ORDER BY name UNION SELECT 'Summe: ' AS name, SUM(price) FROM t_produkt; ERROR: syntax error at or near "SELECT" at character 55 LINE 1: ...CT name, price FROM t_produkt ORDER BY name UNION SELECT 'Su...
Oft ist es notwendig, die einzelnen Teile des Ergebnisses in unterschiedlicher Reihenfolge auszugeben. In solchen Fällen müssen Sie einen Teil der Query in ein Subselect verpacken, um die entsprechende Sortierreihenfolge zu erreichen. Das nächste Beispiel zeigt, wie Sie die Produkte absteigend sortieren können. Am Ende des Listings soll die Summe aufscheinen:
test=# SELECT *
FROM (SELECT name, price
FROM t_produkt
ORDER BY name DESC) AS x
UNION SELECT 'Summe: ' AS name, SUM(price)
FROM t_produkt;
name | price
--------------+--------
Apfel | 0.45
Kasten | 216
Käsestangerl | 2
Rose | 2.16
Semmel | 1
Summe: | 221.61
(6 rows)
Neben UNION definiert SQL noch weitere Schlüsselwörter: INTERSECT bildet die Schnittmenge zwischen zwei Datenbeständen. In der Praxis sieht das dann so aus:
test=# SELECT *
FROM t_produkt_gruppe
WHERE produkt_id IN (1, 2, 3)
INTERSECT
SELECT *
FROM t_produkt_gruppe
WHERE produkt_id IN (1, 2);
produkt_id | gruppe
------------+--------------
1 | Lebensmittel
2 | Lebensmittel
(2 rows)
Wir erhalten nur die Gruppen 1 und 2.
Wollen Sie das Ergebnis von zwei SQL-Statements voneinander abziehen, können Sie auf EXCEPT zurückgreifen:
test=# SELECT *
FROM t_produkt_gruppe
WHERE produkt_id IN (1, 2, 3)
EXCEPT
SELECT *
FROM t_produkt_gruppe
WHERE produkt_id IN (1, 2);
produkt_id | gruppe
------------+--------
3 | Möbel
(1 row)
Es bleibt in diesem Fall nur die Produktgruppe 3 übrig.