Select-Klausel - Syntax

Gilt für: WatchGuard Advanced EPDR

Dieses Thema beschreibt die allgemeine Syntax einer SQL SELECT-Aussage.

SELECT [DISTINCT] expr_list
	[FROM [db.] table | (subquery) | table_function]
	[SAMPLE sample_coeff]
	[GLOBAL] [ANY|ALL] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER] JOIN (subquery)|table USING columns_list
	[PREWHERE expr]
	[WHERE expr]
	[GROUP BY expr_list] [WITH TOTALS]
	[HAVING expr]
	[ORDER BY expr_list]
	[LIMIT [n, ]m]
	[UNION ALL...]
	[LIMIT n BY columns]

Sie können die folgenden Klauseln in einer SQL-Abfrage verwenden:

FROM-Klausel

Die FROM-Klausel gibt die Quelle an, von der Daten gelesen werden sollen (beispielsweise eine Tabelle, Unterabfrage oder JOIN-Klausel). Sie müssen Unterabfragen in Klammern angeben. Im Gegensatz zu Standard-SQL müssen Sie nach einer Unterabfrage kein Synonym angeben. Zu Kompatibilitätszwecken können Sie nach einer Unterabfrage ‘name AS’ vorgeben, aber der angegebene Name wird nicht verwendet.

SAMPLE-Klausel

Die SAMPLE-Klausel bearbeitet die Abfragen für geschätzte Daten.

Wenn Sie die SAMPLE-Klausel verwenden, wird die Abfrage nicht für alle Daten ausgeführt, sondern nur für einen Prozentsatz der Daten (Stichprobe). Wenn Sie beispielsweise Statistiken für eine Reihe von Ereignissen berechnen müssen, reicht es aus, die Abfrage für 10 % aller Ereignisse auszuführen und das Ergebnis dann mit 10 zu multiplizieren.

Eine annäherungsweise Abfragebearbeitung kann in folgenden Fällen hilfreich sein:

  • Wenn Sie die Ergebnisberechnung beschleunigen möchten.
  • Wenn Ihre Rohdaten nicht genau sind, so dass eine Schätzung die Qualität der Ergebnisse nicht wesentlich verschlechtert.

Datenstichproben haben die folgenden Merkmale:

  • Es ist ein deterministischer Mechanismus. Das Ergebnis derselben Abfrage bleibt stets gleich.
  • Funktioniert einheitlich für verschiedene Tabellen. Bei Tabellen mit einem einzigen Stichprobenschlüssel wählt eine Stichprobe mit demselben Koeffizienten immer die gleiche Teilmenge der möglichen Daten. Dies bedeutet, dass Sie die Stichprobe in Unterabfragen in der IN-Klausel verwenden können. Sie können auch die JOIN-Klausel nutzen, um Stichproben zusammenzulegen.
  • Liest weniger Daten von einem Laufwerk. Sie müssen den Stichprobenschlüssel richtig angeben.

Syntax für die SAMPLE-Klausel:

Syntax Beschreibung

SAMPLE k

Zahl von 0 bis 1. Die Abfrage wird an k Prozent der Daten ausgeführt. Beispielsweise führt SAMPLE 0.1 die Abfrage an 10 % der Daten aus.

SAMPLE n

n ist ein ausreichend großer Integer. Die Abfrage wird an einer Stichprobe mit mindestens n Zeilen ausgeführt (aber nicht wesentlich mehr). Beispielsweise führt SAMPLE 10000000 die Abfrage an mindestens 10.000.000 Zeilen aus.

SAMPLE k OFFSET m

k und m sind Zahlen von 0 bis 1. Die Abfrage wird an einer Stichprobe mit k Prozent der Daten ausgeführt. Die für die Stichprobe verwendeten Daten werden durch m Prozentsatz ausgeglichen.

JOIN-Klausel

JOIN gibt eine Zusammenführungsoperation in relationaler Algebra an, die Spalten aus einer oder mehreren Tabellen miteinander kombiniert und eine neue Gruppe erstellt, die in einer Tabelle gespeichert oder im Ist-Zustand verwendet werden kann. Zum Erstellen einer neuen Tabelle verwendet JOIN die gemeinsamen Werte in mehreren Tabellen und kombiniert dann die Spalten.

Dies sind die unterstützen Typen der JOIN-Klausel:

  • INNER JOIN (oder JOIN) — Vergleicht jede Zeile in Tabelle A mit Zeilen in Tabelle B, um alle Zeilenpaare zu finden, die die in der ON-Klausel angegebenen Join-Bedingungen erfüllen. Wenn die Join-Bedingung Nicht-NULL-Werten entspricht, werden Spaltenwerte der Zeilenpaare aus Tabellen A und B in einer Ergebniszeile kombiniert.
  • LEFT JOIN (oder LEFT OUTER JOIN) — Beinhaltet stets alle Zeilen der "linken" Tabelle (A), selbst wenn die Join-Bedingung keinen Zeilen in der "rechten" Tabelle (Tabelle B) entspricht. Dies bedeutet, dass, wenn es (für eine gegebene Zeile in Tabelle A) keine Ergebniszeilen (0) für die ON-Klausel in Tabelle B gibt, dann wird die Kombination dennoch eine Zeile im Ergebnis (für diese Zeile) ausgeben — jedoch mit NULL in allen Spalten aus Tabelle B.
  • RIGHT JOIN (oder RIGHT OUTER JOIN) — Beinhaltet stets alle Zeilen der "rechten" Tabelle (B), selbst wenn die Join-Bedingung keinen Zeilen in der "linken" Tabelle (Tabelle A) entspricht. Dies bedeutet, dass wenn es (für eine gegebene Zeile in Tabelle B) keine Ergebniszeilen (0) für die ON-Klausel in Tabelle A gibt, dann wird die Kombination dennoch eine Zeile im Ergebnis (für diese Zeile) ausgeben — jedoch mit NULL in allen Spalten aus Tabelle A.
  • FULL JOIN (oder FULL OUTER JOIN) — Kombiniert die Wirkung von LEFT JOIN und RIGHT JOIN. Wenn Zeilen in den vollständigen äußeren zusammengelegten Tabellen nicht übereinstimmen, dann wird das Ergebnisset NULL-Werte für alle Spalten der Tabelle haben, denen eine zugehörige Zeile fehlt. Für übereinstimmende Zeilen wird im Ergebnisset eine einzige Zeile ausgegeben, die Spalten beinhaltet, die von beiden Tabellen stammen.
  • CROSS JOIN (oder , ) — Gibt das kartesische Produkt der Zeilen der Tabellen in der Zusammenführung aus. Sie erzeugt Zeilen, die jede Zeile aus der ersten Tabelle mit jeder Zeile aus der zweiten Tabelle kombinieren.
  • ANY- oder ALL-Modifikator — Wenn ALL vorgegeben wird und die rechte Tabelle mehrere übereinstimmende Zeilen hat, dann werden die Daten mit der Zahl der Zeilen multipliziert. Dies ist das normale Verhalten einer JOIN-Klausel in Standard-SQL. Wenn ANY vorgegeben wird und die rechte Tabelle mehrere übereinstimmende Zeilen hat, dann wird nur die erste gefundene zusammengeführt. Falls die rechte Tabelle nur eine übereinstimmende Zeile hat, dann sind die Ergebnisse von ANY und ALL identisch.

WHERE-Klausel

Wenn eine WHERE-Klausel vorliegt, dann muss sie einen Ausdruck mit dem Typ UInt8 beinhalten. Dies ist normalerweise ein Ausdruck mit Vergleichs- und Logikoperatoren. Dieser Ausdruck wird verwendet, um Daten zu filtern, bevor alle Transformationen in die Aussage einbezogen werden.

PREWHERE-Klausel

Diese Klausel hat dieselbe Bedeutung wie die WHERE-Klausel. Der Unterschied besteht darin, welche Daten aus der Tabelle gelesen werden. Bei PREWHERE werden die für die Ausführung der Klausel notwendigen Spalten zuerst gelesen. Dann werden die für die Ausführung der restlichen Abfrage notwendigen Spalten gelesen, wenn der PREWHERE-Ausdruck wahr ist.

PREWHERE filtert Daten effizienter und liest für die Ausführung der Abfrage weniger Daten vom Laufwerk.

GROUP BY-Klausel

Diese Klausel gruppiert Ergebnisse nach einer oder mehreren Spalten. Für das Gruppieren interpretiert Endpoint Security NULL als einen Wert.

Wenn der WITH TOTALS-Modifikator angegeben wird, wird eine weitere Zeile berechnet. Diese Zeile hat Schlüsselspalten, die Standardwerte (Nullen oder leere Zeilen) enthalten, und Spalten mit Aggregationsfunktionen, bei denen die Werte über alle Zeilen hinweg berechnet werden (die Gesamtwerte). Diese zusätzliche Zeile wird nur in den Formaten JSON, TabSeparated und Pretty erzeugt. In JSON-Formaten wird diese Zeile als separates Feld Summen ausgegeben. In TabSeparated-Formaten wird die Zeile nach dem Hauptergebnis, direkt nach einer Leerzeile ausgegeben. In Pretty-Formaten erscheint die Zeilenausgabe als separate Tabelle unter dem Hauptergebnis.

Sie können WITH TOTALS in Unterabfragen nutzen, die Unterabfragen in die JOIN-Klausel einbeziehen (in diesem Fall werden die entsprechenden Gesamtwerte kombiniert).

Caution: Im Gegensatz zu MySQL (und Standard-SQL) unterstützt die Aussage GROUP BY positionale Argumente nicht. Beispielsweise wird GROUP BY 1, 2 als Gruppieren nach Konstante interpretiert (d. h. alle Zeilen in einer).

LIMIT N BY Spalten-Klausel

Diese Klausel wählt die ersten N Zeilen für jede Gruppe von Spalten. LIMIT N BY steht nicht mit LIMIT in Verbindung. Sie können beide in derselben Abfrage verwendet werden. LIMIT N BY kann eine beliebige Anzahl Spalten oder Ausdrücke beinhalten.

HAVING-Klausel

Mit dieser Klausel können Sie die von GROUP BY produzierten Aggregationsergebnisse filtern. Sie ähnelt der WHERE-Klausel, aber der Unterschied ist, dass WHERE vor der Aggregation (GROUP BY) ausgeführt wird, während HAVING danach ausgeführt wird. Sie können HAVING nicht verwenden, wenn keine Aggregation durchgeführt wurde.

Caution: Im Gegensatz zu MySQL (und Standard-SQL) unterstützt die Aussage GROUP BY positionale Argumente nicht.

ORDER BY-Klausel

Die ORDER BY-Klausel beinhaltet eine Liste von Ausdrücken, die jeweils einen DESC (absteigenden) oder ASC (aufsteigenden) Modifikator haben können, um die Sortierreihenfolge festzulegen. Wenn die Richtung nicht angegeben wird, wird von ASC ausgegangen. Die Sortierreihenfolge gilt für einen einzigen Ausdruck, nicht die ganze Liste.

Zeilen, die identische Werte für die Liste der Sortierausdrücke haben, werden in zufälliger Reihenfolge ausgegeben, die auch jedes Mal anders sein kann. Wenn dieORDER BY-Klausel weggelassen wird, ist die Reihenfolge der Zeilen ebenfalls undefiniert und kann jedes Mal anders sein.

COLLATE

Wenn Sie nach Zeichenfolgewerten sortieren, können Sie COLLATE verwenden, um das Alphabet vorzugeben, das Sie verwenden möchten. Verwenden Sie beispielsweise ORDER BY SearchPhrase COLLATE 'tr', um nach Stichwort in aufsteigender Reihenfolge mit dem türkischen Alphabet ohne Berücksichtigung von Groß- und Kleinschreibung zu sortieren. Dies geht von der Annahme aus, dass die Zeichenfolgen UTF-8-codiert sind.

Sie können COLLATE für jeden Ausdruck separat vorgeben oder auch nicht. Wenn Sie ASC oder DESC vorgeben, geben Sie danach COLLATE an. Wenn Sie COLLATE verwenden, berücksichtigt die Sortierung die Groß- oder Kleinschreibung nie.

Wir empfehlen Ihnen, COLLATE nur für die endgültige Sortierung einer geringen Zahl Zeilen zu verwenden, da die Sortierung mit COLLATE weniger effizient ist als die normale Sortierung anhand von Bytes.

NaN und NULL-Sortierreihenfolge:

  • Mit dem Modifikator NULLS FIRST — Zuerst NULL, dann NaN, dann andere Werte.
  • Mit dem Modifikator NULLS LAST — Zuerst die Werte, dann NaN, dann NULL.
  • Standard — Wie bei Modifikator NULLS LAST.

Wenn Gleitkommazahlen sortiert werden, sind NaNs von den anderen Werten getrennt. Unabhängig von der Sortierreihenfolge kommen NaNs am Ende. Bei aufsteigender Sortierung werden sie so platziert, als seien sie größer als alle anderen Zahlen, während sie bei absteigender Sortierung so platziert werden, als seien sie kleiner als andere Zahlen.

SELECT-Klausel

In der SELECT-Klausel angegebene Ausdrücke werden berechnet, nachdem alle Operationen in den darüber beschriebenen Klauseln abgeschlossen sind. Falls Ausdrücke in der SELECT-Klausel Aggregationsfunktionen beinhalten, dann aggregieren die Lösungsprozesse die verwendeten Funktionen und Ausdrücke als ihre Argumente bei der GROUP BY-Aggregation. Diese Ausdrücke wirken, als ob sie auf separate Zeilen im Ergebnis angewendet werden.

DISTINCT-Klausel

Wenn Sie DISTINCT angeben, verbleibt nur eine einzige Zeile aller Sets vollständig übereinstimmender Zeilen im Ergebnis. Es ist möglich, dasselbe Ergebnis zu erzielen, indem man GROUP BY für dasselbe Set an Werten wie in der SELECT-Klausel angegeben anwendet ohne Aggregationsfunktionen zu verwenden. Die DISTINCT-Klausel unterscheidet sich wie folgt von der GROUP BY-Klausel:

  • DISTINCT kann zusammen mit GROUP BY angewendet werden.

  • Wenn Sie ORDER BY weglassen und LIMIT definieren, stoppt die Abfrage sofort, nachdem die erforderliche Anzahl unterschiedlicher Zeilen gelesen wurde.

  • Es werden Datenblöcke ausgegeben, wenn sie verarbeitet werden, ohne auf den Abschluss der gesamten Abfrage zu warten.

DISTINCT arbeitet mit NULL, als ob NULL ein spezifischer Wert wäre. In anderen Worten: in den DISTINCT-Ergebnissen treten unterschiedliche Kombinationen mit NULL nur einmal auf.

LIMIT m-Klausel

Diese Klausel wählt die ersten m Zeilen des Ergebnisses aus.

LÍMIT n, m wählt die ersten m Zeilen des Ergebnisses nach Überspringen der ersten n Zeilen. Die Syntax LIMIT m OFFSET n ist gleichwertig. n und m müssen nicht-negative Integer sein.

Wenn es keine ORDER BY-Klausel gibt, die die Ergebnisse explizit sortiert, kann die Wahl der Zeilen für das Ergebnis zufällig und nicht deterministisch sein.

UNION ALL-Klausel

Sie können diese Klausel verwenden, um eine beliebige Anzahl Abfragen zu kombinieren. Nur UNION ALL wird unterstützt. UNION (UNION DISTINCT) wird nicht unterstützt. Wenn Sie UNION DISTINCT benötigen, können Sie SELECT DISTINCT von einer Unterabfrage, die UNION ALL beinhaltet, eingeben. Abfragen, die Teil von UNION ALL sind, können gleichzeitig ausgeführt werden und ihre Ergebnisse können miteinander vermischt werden.

Die Struktur der Ergebnisse (die Anzahl und der Typ der Spalten) muss für die Abfragen übereinstimmen, aber die Spaltennamen können unterschiedlich sein. In diesem Fall werden die Spaltennamen für das Endergebnis aus der ersten Abfrage übernommen. Type-Casting wird für Zusammenlegungen verwendet. Wenn beispielsweise zwei Abfragen mit demselben Feld mit Nicht-Nullable- und Nullable-Typen von einem kompatiblen Typ kombiniert werden, dann hat das resultierende UNION ALL ein Typfeld Nullable.

Sie können Abfragen, die Teil von UNION ALL sind, nicht in Klammern setzen. ORDER BY und LIMIT werden auf separate Abfragen und nicht auf das Endergebnis angewendet. Wenn Sie eine Umwandlung auf das Endergebnis anwenden müssen, dann können Sie alle Abfragen mit UNION ALL in eine Unterabfrage in der FROM-Klausel setzen.

IN-Operatoren

Dieser Abschnitt beschreibt die Operatoren IN, NOT IN, GLOBAL IN und GLOBAL NOT IN.

Die linke Seite des IN-Operators ist entweder eine einzelne Spalte oder ein Tuple. Beispielsweise SELECT UserID IN (123, 456) FROM ...

Wenn die linke Seite eine einzige Spalte ist, die im Index ist, und die rechte Seite eine Reihe von Konstanten, dann benutzt das System den Index, um die Abfrage zu bearbeiten.

Die rechte Seite des Operators kann ein Set konstanter Ausdrücke, ein Set Tuples, der Name einer Datenbanktabelle oder eine SELECT-Unterabfrage in Klammern sein. Die Unterabfrage kann mehr als eine Spalte zum Filtern von Tuples angeben. Zum Beispiel:

SELECT (CounterID, UserID) IN (SELECT CounterID, UserID FROM ...) FROM ....

Die Spalten links und rechts des Operators IN müssen denselben Typ haben.

Der IN-Operator und die Unterabfrage können in einem beliebigen Teil der Abfrage vorkommen, einschließlich in Aggregationsfunktionen und Lambda-Funktionen.

NULL-Bearbeitung

Der Operator IN geht davon aus, dass das Ergebnis einer Operation mit NULL immer 0 entspricht, unabhängig davon, ob sich NULL auf der rechten oder linken Seite des Operators befindet. NULL-Werte sind in keinen Datensets enthalten, entsprechen einander nicht und können nicht verglichen werden.

Das Sternchensymbol (*)

Sie können ein Sternchen in einen beliebigen Teil einer Abfrage anstatt eines Ausdrucks einsetzen. Wenn die Abfrage analysiert wird, erweitert sich das Sternchen zu einer Liste aller Tabellenspalten.

Sie können ein Sternchen in den folgenden Fällen verwenden:

  • Um ein Tabellen-Abbild zu erstellen.
  • Für Tabellen, die nur wenige Spalten beinhalten. Wenn es eine starke Filterung bei einer kleinen Zahl Spalten gibt, verwenden Sie PREWHERE.
  • Um Informationen über die Spalten in einer Tabelle zu erhalten. In diesem Fall legen Sie LIMIT 1 fest. Wir empfehlen Ihnen, die Abfrage DESC TABLE zu verwenden.
  • In Unterabfragen, weil Spalten, die für die externe Abfrage nicht benötigt werden, von Unterabfragen ausgeschlossen sind.

In allen anderen Fällen empfehlen wir Ihnen die Verwendung des Sternchens nicht, um Performance-Probleme zu vermeiden.

Ähnliche Themen

Erweiterte SQL-Abfrage - Syntax

Aggregationsfunktionen

Unterstützte Datentypen

Reguläre Funktionen