Zum Inhalt springen

SELECT-Anweisung

Die SELECT-Anweisung ruft Zeilen aus der Datenbank ab.

Beispiele

Alle Spalten der Tabelle tbl auswählen:

SELECT * FROM tbl;

Die Zeilen aus tbl auswählen:

SELECT j FROM tbl WHERE i = 3;

Eine Aggregation gruppiert nach der Spalte i durchführen:

SELECT i, sum(j) FROM tbl GROUP BY i;

Nur die obersten 3 Zeilen aus tbl auswählen:

SELECT * FROM tbl ORDER BY i DESC LIMIT 3;

Zwei Tabellen mit der USING-Klausel joinen:

SELECT * FROM t1 JOIN t2 USING (a, b);

Spaltenindizes verwenden, um die erste und dritte Spalte der Tabelle tbl auszuwählen:

SELECT #1, #3 FROM tbl;

Alle eindeutigen Städte aus der Adresstabelle auswählen:

SELECT DISTINCT city FROM addresses;

Einen STRUCT über eine Zeilenvariable zurückgeben:

SELECT d
FROM (SELECT 1 AS a, 2 AS b) d;

Syntax

Die SELECT-Anweisung ruft Zeilen aus der Datenbank ab. Die kanonische Reihenfolge einer SELECT-Anweisung ist wie folgt, wobei weniger häufige Klauseln eingerückt sind:

SELECT ⟨select_list⟩
FROM ⟨tables⟩
USING SAMPLE ⟨sample_expression⟩
WHERE ⟨condition⟩
GROUP BY ⟨groups⟩
HAVING ⟨group_filter⟩
WINDOW ⟨window_expression⟩
QUALIFY ⟨qualify_filter⟩
ORDER BY ⟨order_expression⟩
LIMIT ⟨n⟩;

Optional kann der SELECT-Anweisung eine WITH-Klausel vorangestellt werden.

Da die SELECT-Anweisung so komplex ist, haben wir die Syntaxdiagramme in mehrere Teile aufgeteilt. Das vollständige Syntaxdiagramm finden Sie am Ende der Seite.

SELECT-Klausel

Die SELECT-Klausel gibt die Liste der Spalten an, die von der Abfrage zurückgegeben werden. Obwohl sie in der Klausel zuerst erscheint, werden die Ausdrücke hier logisch erst am Ende ausgeführt. Die SELECT-Klausel kann beliebige Ausdrücke enthalten, die die Ausgabe transformieren, sowie Aggregate und Fensterfunktionen. Das Schlüsselwort DISTINCT stellt sicher, dass nur eindeutige Tupel zurückgegeben werden.

Spaltennamen sind groß-/kleinschreibungsunabhängig. Weitere Details finden Sie in den Regeln zur Groß-/Kleinschreibung.

FROM-Klausel

Die FROM-Klausel gibt die Quelle der Daten an, auf denen der Rest der Abfrage arbeiten soll. Logisch beginnt die Ausführung der Abfrage bei der FROM-Klausel. Die FROM-Klausel kann eine einzelne Tabelle, eine Kombination mehrerer gejointe Tabellen oder eine weitere SELECT-Abfrage in einem Unterabfrageknoten enthalten.

SAMPLE-Klausel

Die SAMPLE-Klausel erlaubt es, die Abfrage auf einer Stichprobe der Basistabelle auszuführen. Das kann die Verarbeitung von Abfragen deutlich beschleunigen, auf Kosten der Genauigkeit des Ergebnisses. Stichproben können auch verwendet werden, um beim Erkunden eines Datensatzes schnell einen Snapshot der Daten zu sehen. Die SAMPLE-Klausel wird unmittelbar nach allem in der FROM-Klausel angewendet (d. h. nach allen Joins, aber vor der Where-Klausel oder Aggregaten). Weitere Informationen finden Sie auf der Seite Stichproben.

WHERE-Klausel

Die WHERE-Klausel legt Filter fest, die auf die Daten angewendet werden. So können Sie nur die Teilmenge der Daten auswählen, die Sie interessiert. Logisch wird die WHERE-Klausel unmittelbar nach der FROM-Klausel angewendet.

GROUP BY- und HAVING-Klauseln

Die GROUP BY-Klausel gibt an, welche Gruppierungsspalten für Aggregationen in der SELECT-Klausel verwendet werden sollen. Ist die GROUP BY-Klausel angegeben, ist die Abfrage immer eine Aggregatabfrage, auch wenn in der SELECT-Klausel keine Aggregationen vorhanden sind.

WINDOW-Klausel

Die WINDOW-Klausel ermöglicht es, benannte Fenster anzugeben, die in Fensterfunktionen verwendet werden können. Das ist nützlich, wenn Sie mehrere Fensterfunktionen haben, weil Sie so dieselbe Fensterklausel nicht wiederholen müssen.

QUALIFY-Klausel

Die QUALIFY-Klausel dient dazu, das Ergebnis von WINDOW-Funktionen zu filtern.

ORDER BY-, LIMIT- und OFFSET-Klauseln

ORDER BY, LIMIT und OFFSET sind Ausgabemodifikatoren. Logisch werden sie ganz am Ende der Abfrage angewendet. Die ORDER BY-Klausel sortiert die Zeilen nach den Sortierkriterien aufsteigend oder absteigend. Die LIMIT-Klausel beschränkt die Anzahl der abgerufenen Zeilen, während die OFFSET-Klausel angibt, an welcher Position das Lesen der Werte beginnt.

VALUES-Liste

Eine VALUES-Liste ist eine Menge von Werten, die anstelle einer SELECT-Anweisung angegeben wird.

Zeilen-IDs

Für jede Tabelle gibt die Pseudospalte rowid die Zeilenkennungen auf Basis des physischen Speichers zurück.

CREATE TABLE t (id INTEGER, content VARCHAR);
INSERT INTO t VALUES (42, 'hello'), (43, 'world');
SELECT rowid, id, content FROM t;
rowid id content
0 42 hello
1 43 world

Im aktuellen Speicher sind diese Kennungen zusammenhängende vorzeichenlose Ganzzahlen (0, 1, …), wenn keine Zeilen gelöscht wurden. Löschungen erzeugen Lücken in den Rowids, die später wiederverwendet werden können:

CREATE OR REPLACE TABLE t AS (FROM range(10) r(i));
DELETE FROM t WHERE i % 2 = 0;
SELECT rowid FROM t;
rowid
1
3
5
7
9

Die rowid-Werte sind innerhalb einer Transaktion stabil.

Best Practice Es wird dringend empfohlen, Rowids nicht als Kennungen zu verwenden.

Gibt es eine benutzerdefinierte Spalte namens rowid, überschattet sie die Pseudospalte rowid.

Common Table Expressions

Vollständiges Syntaxdiagramm

Unten ist das vollständige Syntaxdiagramm der SELECT-Anweisung: