Anwendung von bedingten Anweisungen in ON / WHERE
Hier habe ich die Schritte der logischen Abfrageverarbeitung erläutert.
Referenz: T-SQL-Abfragen in Microsoft® SQL Server™ 2005
Herausgeber: Microsoft Press
Veröffentlichungsdatum: März 07, 2006
Drucken ISBN-10: 0-7356-2313-9
Gedruckt ISBN-13: 978-0-7356-2313-2
Seiten: 640
Einblick in Microsoft® SQL Server™ 2005 T-SQL-Abfragen
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
Der erste auffällige Aspekt von SQL, der sich von anderen Programmiersprachen unterscheidet, ist die Reihenfolge, in der der Code verarbeitet wird. In den meisten Programmiersprachen wird der Code in der Reihenfolge verarbeitet, in der er geschrieben wird. In SQL wird als erstes die FROM-Klausel verarbeitet, während die SELECT-Klausel, die an erster Stelle steht, fast zuletzt verarbeitet wird.
Jeder Schritt erzeugt eine virtuelle Tabelle, die als Eingabe für den nächsten Schritt verwendet wird. Diese virtuellen Tabellen sind für den Aufrufer (Client-Anwendung oder äußere Abfrage) nicht verfügbar. Nur die vom letzten Schritt erzeugte Tabelle wird an den Aufrufer zurückgegeben. Wenn eine bestimmte Klausel in einer Abfrage nicht angegeben ist, wird der entsprechende Schritt einfach übersprungen.
Kurzbeschreibung der Phasen der logischen Abfrageverarbeitung
Machen Sie sich nicht zu viele Sorgen, wenn die Beschreibung der Schritte im Moment nicht viel Sinn zu machen scheint. Sie sind als Referenz gedacht. In den Abschnitten, die nach dem Beispielszenario folgen, werden die Schritte viel ausführlicher behandelt.
-
VON: Zwischen den ersten beiden Tabellen in der FROM-Klausel wird ein kartesisches Produkt (Cross-Join) gebildet, und als Ergebnis wird die virtuelle Tabelle VT1 erstellt.
-
ON: Der Filter ON wird auf VT1 angewendet. Nur Zeilen, für die der <join_condition>
TRUE ist, werden in VT2 eingefügt.
-
OUTER (join): Wenn ein OUTER JOIN angegeben ist (im Gegensatz zu einem CROSS JOIN oder einem INNER JOIN), werden Zeilen aus der erhaltenen Tabelle oder den erhaltenen Tabellen, für die keine Übereinstimmung gefunden wurde, zu den Zeilen aus VT2 als äußere Zeilen hinzugefügt, wodurch VT3 entsteht. Wenn mehr als zwei Tabellen in der FROM-Klausel erscheinen, werden die Schritte 1 bis 3 wiederholt zwischen dem Ergebnis der letzten Verknüpfung und der nächsten Tabelle in der FROM-Klausel angewendet, bis alle Tabellen verarbeitet sind.
-
WO: Der WHERE-Filter wird auf VT3 angewendet. Nur Zeilen, für die der <where_condition>
TRUE ist, werden in VT4 eingefügt.
-
GROUP BY: Die Zeilen aus VT4 werden auf der Grundlage der in der GROUP BY-Klausel angegebenen Spaltenliste in Gruppen angeordnet. VT5 wird erzeugt.
-
CUBE | ROLLUP: Supergruppen (Gruppen von Gruppen) werden zu den Zeilen von VT5 hinzugefügt und erzeugen VT6.
-
HAVING: Der HAVING-Filter wird auf VT6 angewendet. Nur Gruppen, für die der <having_condition>
TRUE ist, werden in VT7 eingefügt.
-
SELECT: Die SELECT-Liste wird abgearbeitet und erzeugt VT8.
-
DISTINCT: Doppelte Zeilen werden aus VT8 entfernt. VT9 wird erzeugt.
-
ORDER BY: Die Zeilen aus VT9 werden nach der in der ORDER BY-Klausel angegebenen Spaltenliste sortiert. Es wird ein Cursor erzeugt (VC10).
-
TOP: Die angegebene Anzahl oder der angegebene Prozentsatz von Zeilen wird ab dem Anfang von VC10 ausgewählt. Die Tabelle VT11 wird erstellt und an den Aufrufer zurückgegeben.
Daher werden die Daten vor der Anwendung der WHERE-Klausel durch (INNER JOIN) ON gefiltert (die Datenanzahl von VT wird hier selbst reduziert). Die nachfolgenden Join-Bedingungen werden mit gefilterten Daten ausgeführt, was die Leistung verbessert. Danach wendet nur noch die WHERE-Bedingung Filterbedingungen an.
(Die Anwendung von bedingten Anweisungen in ON / WHERE wird in wenigen Fällen keinen großen Unterschied machen. Dies hängt davon ab, wie viele Tabellen Sie verbunden haben und wie viele Zeilen in den einzelnen Verbindungstabellen verfügbar sind.)
2 Stimmen
@Marco: hier ist es
2 Stimmen
Mögliche Duplikate von SQL left join vs. mehrere Tabellen in der FROM-Zeile?
32 Stimmen
Wenn ich es richtig verstanden habe, handelt es sich bei der ersten Variante um die implizite ANSI-SQL-89-Syntax und bei der zweiten Variante um die explizite ANSI-SQL-92-Join-Syntax. Beide führen in konformen SQL-Implementierungen zum gleichen Ergebnis und beide führen in gut gemachten SQL-Implementierungen zum gleichen Abfrageplan. Ich persönlich bevorzuge die SQL-89-Syntax, aber viele Leute bevorzugen die SQL-92-Syntax.
12 Stimmen
@Hogan Ich habe nur auf die offiziellen Bezeichnungen für die verschiedenen Syntaxen hingewiesen. Da in keiner der Antworten die vollständigen Namen genannt wurden, habe ich beschlossen, diese als Kommentar hinzuzufügen. Da mein Kommentar jedoch nicht die eigentliche Frage beantwortet, habe ich ihn als Kommentar und nicht als Antwort hinzugefügt. (In den Antworten mit hoher Stimmenzahl werden Behauptungen aufgestellt wie "INNER JOIN ist ANSI-Syntax" und "implicit join ANSI syntax is older", was überhaupt nichts aussagt, da beide Syntaxen unterschiedliche ANSI-Syntaxen sind).