Anwenden von bedingten Anweisungen in ON / WHERE
Hier habe ich die logischen Abfrageverarbeitungsschritte erklärt.
Referenz: In Microsoft® SQL Server ™ 2005 T-SQL-Abfrage
Herausgeber: Microsoft Press Veröffentlichungsdatum:
07. März 2006
Drucken Sie ISBN-10: 0-7356-2313-9
Drucken Sie ISBN-13: 978-0-7356-2313-2
Seiten: 640
In Microsoft® SQL Server ™ 2005 T-SQL-Abfrage
(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 wurde. In SQL ist die erste Klausel, die verarbeitet wird, die FROM-Klausel, während die SELECT-Klausel, die zuerst angezeigt wird, fast zuletzt verarbeitet wird.
Jeder Schritt generiert eine virtuelle Tabelle, die als Eingabe für den folgenden Schritt verwendet wird. Diese virtuellen Tabellen stehen dem Aufrufer nicht zur Verfügung (Clientanwendung oder äußere Abfrage). Nur die vom letzten Schritt generierte Tabelle wird an den Aufrufer zurückgegeben. Wenn in einer Abfrage keine bestimmte Klausel angegeben ist, wird der entsprechende Schritt einfach übersprungen.
Kurze Beschreibung der Phasen der Verarbeitung logischer Abfragen
Machen Sie sich nicht zu viele Sorgen, wenn die Beschreibung der Schritte vorerst nicht viel Sinn macht. Diese dienen als Referenz. Abschnitte, die nach dem Szenariobeispiel folgen, werden die Schritte ausführlicher behandeln.
FROM: Ein kartesisches Produkt (Cross Join) wird zwischen den ersten beiden Tabellen in der FROM-Klausel ausgeführt, und als Ergebnis wird die virtuelle Tabelle VT1 generiert.
EIN: Der EIN-Filter wird auf VT1 angewendet. Nur Zeilen, für die <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 oder den erhaltenen Tabellen oder Tabellen, für die keine Übereinstimmung gefunden wurde, als äußere Zeilen zu den Zeilen von VT2 hinzugefügt VT3. Wenn in der FROM-Klausel mehr als zwei Tabellen enthalten sind, werden die Schritte 1 bis 3 zwischen dem Ergebnis des letzten Joins und der nächsten Tabelle in der FROM-Klausel wiederholt angewendet, bis alle Tabellen verarbeitet sind.
WHERE: Der WHERE-Filter wird auf VT3 angewendet. Nur Zeilen, für die <where_condition>
TRUE ist, werden in VT4 eingefügt.
GROUP BY: Die Zeilen von VT4 sind basierend auf der in der GROUP BY-Klausel angegebenen Spaltenliste in Gruppen angeordnet. VT5 wird generiert.
WÜRFEL | ROLLUP: Supergruppen (Gruppen von Gruppen) werden zu den Zeilen von VT5 hinzugefügt, wodurch VT6 generiert wird.
HAVING: Der HAVING-Filter wird auf VT6 angewendet. Nur Gruppen, für die <having_condition>
TRUE ist, werden in VT7 eingefügt.
SELECT: Die SELECT-Liste wird verarbeitet und generiert VT8.
DISTINCT: Doppelte Zeilen werden aus VT8 entfernt. VT9 wird generiert.
ORDER BY: Die Zeilen von VT9 werden gemäß der in der ORDER BY-Klausel angegebenen Spaltenliste sortiert. Ein Cursor wird erzeugt (VC10).
TOP: Die angegebene Anzahl oder der angegebene Prozentsatz der Zeilen wird ab dem Beginn von VC10 ausgewählt. Tabelle VT11 wird generiert und an den Anrufer zurückgegeben.
Daher filtert (INNER JOIN) ON die Daten (die Datenanzahl von VT wird hier selbst reduziert), bevor die WHERE-Klausel angewendet wird. Die nachfolgenden Verknüpfungsbedingungen werden mit gefilterten Daten ausgeführt, wodurch die Leistung verbessert wird. Danach wendet nur die WHERE-Bedingung Filterbedingungen an.
(Das Anwenden von bedingten Anweisungen in ON / WHERE macht in einigen Fällen keinen großen Unterschied. Dies hängt davon ab, wie viele Tabellen Sie verbunden haben und wie viele Zeilen in jeder Verknüpfungstabelle verfügbar sind.)