PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Logische Verarbeitungsreihenfolge oder SQL-Standard in der WHERE-Klausel

Es ist die Regel aus dem SQL-Standard (die ziemlich kompliziert ist, weil sie auf viele Details eingeht, an die Benutzer von SQL wahrscheinlich nicht denken).

Hinter der Regel stehen zwei Prinzipien. Der erste ist, dass der Standard keine Reihenfolge der Operationen vorschreibt, außer wenn es logisch notwendig ist (ein having -Klausel muss beispielsweise nach einem group by logisch verarbeitet werden ). Dies ist die Grundlage des Begriffs bei SQL ist ein beschreibendes Sprache, wo die Ergebnisse beschrieben werden. Jede bestimmte Datenbank-Engine kann ihre eigenen Ausführungspfade bestimmen.

Das zweite Prinzip besteht darin, Mehrdeutigkeiten zu vermeiden. Hier kommen Scoping-Regeln ins Spiel, die definieren, was ein SQL-Compiler wann weiß.

Betrachten Sie die folgende Anweisung:

select a as b, b as a, a + 1 as d
-----------------------^
from t

Die Frage ist:welcher a macht a+1 beziehen sich auf die Spalte a in der Tabelle oder der Spalte b (das als a aliased wird ) in der select . Nach der Norm ist dies eindeutig. Spaltenaliase sind im select nicht bekannt Klausel, in der sie definiert sind.

Dies erstreckt sich bis zum where Klausel, die im gleichen Umfang ausgewertet wird. Betrachten Sie dasselbe Beispiel:

select a as b, b as a, a + 1 as d
from t
where a > 100

Welcher a macht das where Bedingung beziehen? Der Maßstab ist eindeutig. Das where -Klausel versteht keine Spaltenaliase in select . Das liegt daran, dass select wird (logischerweise) nach dem where ausgewertet . Wenn Sie also sagen:

select row_number() over (order by a) as seqnum
from t
where a > 100

Der zurückgegebene Wert beginnt mit dem ersten a nach 100. Die Aufzählung findet nicht zuerst statt, wobei gefilterte Zeilen Sequenznummern erhalten, die herausgefiltert werden.