| PostgreSQL: Das Offizielle Handbuch | ||||
|---|---|---|---|---|
| Zurück | Schnell zurück | Kapitel 7. Anfragen | Schnell nach vorne | Nach vorne |
Wie im vorigen Abschnitt gezeigt wurde, ermittelt der Tabellenausdruck im SELECT-Befehl eine virtuelle Zwischentabelle, indem möglicherweise Tabellen und Sichten kombiniert wurden, Zeilen entfernt oder gruppiert wurden usw. Diese Tabelle wird letztendlich der Select-Liste zur Verarbeitung übergeben. Die Select-Liste bestimmt, welche Spalten der Zwischentabelle tatsächlich ausgegeben werden.
Die einfachste Select-Liste ist *, welche alle Spalten ausgibt, die der Tabellenausdruck erzeugt. Ansonsten ist die Select-Liste eine Liste von Wertausdrücken (wie in Abschnitt 4.2 definiert), durch Kommas voneinander getrennt. Sie könnte zum Beispiel eine Liste von Spaltennamen sein:
SELECT a, b, c FROM ...
Die Spaltennamen a, b und c sind entweder die wirklichen Namen von Spalten der in der FROM-Klausel verwendeten Tabellen oder die Aliasnamen, die ihnen wie in Abschnitt 7.2.1.2 zugewiesen wurden. Der Namensraum, der in der Select-Liste zur Verfügung steht, ist der gleiche wie in der WHERE-Klausel, außer wenn eine Gruppierung vorgenommen wird, dann ist es der gleiche wie in der HAVING-Klausel.
Wenn mehrere Tabellen eine Spalte mit dem gleichen Namen haben, dann muss der Tabellenname auch angegeben werden, wie in
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...
(Siehe auch Abschnitt 7.2.2.)
Wenn ein beliebiger Wertausdruck in der Select-Liste verwendet wird, dann kann man sich das so vorstellen, dass eine neue virtuelle Spalte an die Ergebnistabelle angefügt wird. Der Ausdruck wird für jede Ergebniszeile ausgewertet, wobei die Werte der Zeile für etwaige Spaltenverweise eingesetzt werden. Aber die Ausdrücke in der Select-Liste müssen nicht unbedingt eine Spalte aus dem Tabellenausdruck aus der FROM-Klausel verwenden; sie können zum Beispiel auch konstante mathematische Ausdrücke sein.
Den Einträgen in der Select-Liste kann man Namen für die weitere Verarbeitung geben. Die „weitere Verarbeitung“ ist in diesem Fall eine mögliche Sortierklausel und Clientanwendungen (zum Beispiel als Spaltenköpfe wenn die Ergebnistabelle ausgegeben wird). Zum Beispiel:
SELECT a AS wert, b + c AS summe FROM ...
Wenn kein Spaltenname mit AS angegeben wird, dann wird vom System ein Name zugewiesen. Für einfache Spaltenverweise ist das der Namen der Spalte. Für Funktionsaufrufe ist das der Name der Funktion. Für komplexe Ausdrücke wird vom System ein Name erzeugt.
Anmerkung: Die hier beschriebene Vergabe von Namen an die Spalten ist nicht das Gleiche wie die Vergabe von Aliasnamen in der FROM-Klausel (siehe Abschnitt 7.2.1.2). Durch diesen Ablauf können Sie eine Spalte praktisch zweimal umbenennen, aber der Name, der in der Select-Liste bestimmt wird, wird am Ende weitergegeben.
Nachdem die Select-Liste verarbeitet wurde, können aus der Ergebnistabelle wahlweise etwaige Duplikate entfernt werden. Dazu wird das Schlüsselwort DISTINCT gleich hinter das SELECT geschrieben:
SELECT DISTINCT select_liste ...
(Anstelle von DISTINCT kann das Wort ALL verwendet werden, um das normale Verhalten, dass alle Zeilen beibehalten werden, auszuwählen.)
Selbstverständlich gelten zwei Zeilen als dann verschieden voneinander, wenn sie sich in mindestens einem Spaltenwert voneinander unterscheiden. NULL-Werte gelten in dieser Betrachtung als gleich.
Als Alternative kann auch ein beliebiger Ausdruck bestimmen, welche Zeilen als gleich betrachtet werden sollen:
SELECT DISTINCT ON (ausdruck [, ausdruck ...]) select_liste ...Hierbei ist ausdruck ein beliebiger Wertausdruck, der für alle Zeilen ausgewertet wird. Die Zeilen, für die alle Ausdrücke gleich sind, werden als gleich betrachtet und nur die erste der Zeilen wird in der Ergebnismenge behalten. Beachten Sie, dass die „erste Zeile“ einer Menge nicht vorhergesagt werden kann, außer wenn die Anfrage nach ausreichend vielen Spalten sortiert wird, damit die Zeilen in einer eindeutigen Reihenfolge am DISTINCT-Filter ankommen. (Die Verarbeitung von DISTINCT ON geschieht nach der Sortierung durch ORDER BY.)
Die DISTINCT ON-Klausel ist nicht Teil des SQL-Standards und manche halten sie wegen der möglicherweise unvorhersehbaren Ergebnisse für schlechten Stil. Wenn man GROUP BY und Unteranfragen in der FROM-Klausel geschickt anwendet, dann kann man diese Klausel vermeiden, aber sie oft eine bequeme Alternative.
| Zurück | Zum Anfang | Nach vorne |
| Tabellenausdrücke | Nach oben | Anfragen kombinieren |