# SELECT

SELECT-Abfragen führen Datenabfragen durch. Standardmäßig werden die angeforderten Daten an den Client zurückgegeben, während sie in Verbindung mit INSERT INTO an eine andere Tabelle weitergeleitet werden können.

Syntax

SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list
[FROM [db.]table | (subquery) | table_function] [FINAL]
[SAMPLE sample_coeff]
[ARRAY JOIN ...]
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table (ON <expr_list>)|(USING <column_list>)
[PREWHERE expr]
[WHERE expr]
[GROUP BY expr_list] [WITH ROLLUP|WITH CUBE] [WITH TOTALS]
[HAVING expr]
[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [INTERPOLATE [(expr_list)]]
[LIMIT [offset_value, ]n BY columns]
[LIMIT [n, ]m] [WITH TIES]
[SETTINGS ...]
[UNION  ...]
[INTO OUTFILE filename [COMPRESSION type [LEVEL level]] ]
[FORMAT format]

# SELECT-Abfragen

Die in der SELECT-Klausel angegebenen Ausdrücke werden nach Abschluss aller Operationen in den oben beschriebenen Klauseln berechnet. Diese Ausdrücke funktionieren, als ob sie auf separate Zeilen im Ergebnis angewendet würden. Wenn Ausdrücke in der SELECT-Klausel Aggregatfunktionen enthalten, verarbeitet Myscal Aggregatfunktionen und Ausdrücke, die als Argumente verwendet werden, während der GROUP BY-Aggregation.

Wenn Sie alle Spalten in das Ergebnis aufnehmen möchten, verwenden Sie das Sternchen (*)-Symbol. Zum Beispiel SELECT * FROM ....

SELECT * FROM insert_table
SELECT *
FROM insert_table
Query id: 16064ddb-762f-4faf-9932-7f026ebbd6a6
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
│ 3 │ b │ 1 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# ORDER BY-Klausel

Sie können Synonyme (AS-Aliase) in jedem Teil einer Abfrage verwenden.

Die GROUP BY-, ORDER BY- und LIMIT BY-Klauseln können positionale Argumente unterstützen. Dann werden beispielsweise die Zeilen in der Tabelle nach der ersten und dann nach der zweiten Spalte sortiert, wenn ORDER BY 1,2 verwendet wird. Verwenden Sie die Tabelle insert_table als Beispiel oben.

SELECT *
FROM insert_table
ORDER BY c ASC
Query id: 5976cd93-1714-466f-8acc-0a5b35efd22f
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 3 │ b │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# WHERE-Klausel

Sie können die WHERE-Klausel verwenden, um Werte zu filtern, zum Beispiel:

SELECT *
FROM insert_table
WHERE a = '1'
Query id: 273ac209-c4ca-4459-8314-3542913882ea
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
└───┴───┴───┘
3 rows in set. Elapsed: 0.003 sec. 

# PREWHERE-Klausel

Prewhere ist eine Optimierung, um die Filterung effizienter anzuwenden. Es ist standardmäßig aktiviert, auch wenn die PREWHERE-Klausel nicht explizit angegeben ist. Es funktioniert, indem ein Teil der WHERE-Bedingung automatisch in die Prewhere-Stufe verschoben wird. Die Rolle der PREWHERE-Klausel besteht nur darin, diese Optimierung zu steuern, wenn Sie der Meinung sind, dass Sie es besser wissen als standardmäßig.

Mit der Prewhere-Optimierung werden zuerst nur die für die Ausführung des Prewhere-Ausdrucks erforderlichen Spalten gelesen. Dann werden die anderen Spalten gelesen, die für die Ausführung des restlichen Teils der Abfrage benötigt werden, aber nur die Blöcke, in denen der Prewhere-Ausdruck zumindest für einige Zeilen wahr ist. Wenn es viele Blöcke gibt, in denen der Prewhere-Ausdruck für alle Zeilen falsch ist und Prewhere weniger Spalten als andere Teile der Abfrage benötigt, ermöglicht dies oft das Lesen von viel weniger Daten von der Festplatte für die Abfrageausführung.

# Manuelle Steuerung von Prewhere

Die Klausel hat die gleiche Bedeutung wie die WHERE-Klausel. Der Unterschied besteht darin, welche Daten aus der Tabelle gelesen werden. Wenn Sie PREWHERE manuell für Filterbedingungen steuern, die von einer Minderheit der Spalten in der Abfrage verwendet werden, aber eine starke Datenfilterung bieten. Dadurch wird das Datenvolumen reduziert, das gelesen werden muss.

Eine Abfrage kann gleichzeitig PREWHERE und WHERE angeben. In diesem Fall geht PREWHERE WHERE voraus.

Wenn die Einstellung optimize_move_to_prewhere auf 0 gesetzt ist, sind die Heuristiken zum automatischen Verschieben von Teilen von Ausdrücken von WHERE nach PREWHERE deaktiviert.

Wenn die Abfrage den FINAL-Modifikator hat, ist die PREWHERE-Optimierung nicht immer korrekt. Sie ist nur aktiviert, wenn sowohl die Einstellungen optimize_move_to_prewhere als auch optimize_move_to_prewhere_if_final eingeschaltet sind.

# Sonstiges

Für SELECT-Anweisungen im Zusammenhang mit Vektoren siehe: Grundlegende Vektorsuche