Das offensichtlichste Merkmal, das SQL von anderen Programmiersprachen unterscheidet, ist die Reihenfolge, in der der Code verarbeitet wird. In den meisten Programmiersprachen werden Codes in der Codierungsreihenfolge verarbeitet, aber in der SQL-Sprache ist die erste Klausel, die verarbeitet wird, die FROM-Klausel, und obwohl die SELECT-Anweisung zuerst erscheint, wird sie fast immer zuletzt verarbeitet.
Jeder Schritt generiert eine virtuelle Tabelle, die als Eingabe für den nächsten Schritt verwendet wird. Diese virtuellen Tabellen stehen Aufrufern (Clientanwendungen oder externen Abfragen) nicht zur Verfügung. Lediglich die im letzten Schritt generierte Tabelle wird an den Aufrufer zurückgegeben. Wenn in der Abfrage keine Klausel angegeben ist, wird der entsprechende Schritt übersprungen. Im Folgenden finden Sie eine kurze Beschreibung der verschiedenen logischen Schritte, die für SQL Server 2000 und SQL Server 2005 gelten.
Code-Hervorhebung erstellt von Actipro CodeHighlighter (Freeware)
-->(8)SELECT (9)DISTINCT (11)
( 1) FROM [left_table]
(3)
(2) ON
(4) WHERE < where_condition>
(5) GROUP BY
(6) WITH
(7) HAVING
(10)ORDER BY
Einführung in die Phase der logischen Abfrageverarbeitung (Ausführungsreihenfolge)
FROM: Für die ersten beiden im FROM Klausel Die Tabelle führt ein kartesisches Produkt (Cross Join) durch, um die virtuelle Tabelle VT1 zu generieren.
ON: ON-Filter auf VT1 anwenden. Nur die Zeilen, für die
OUTER(JOIN): Wenn OUTER JOIN angegeben ist (relativ zu CROSS JOIN oder (INNER JOIN), konservierte Tabelle: linker äußerer Join markiert die linke Tabelle als reservierte Tabelle, rechter äußerer Join markiert die rechte Tabelle als reservierte Tabelle, a (Vollständiger äußerer Join markiert beide Tabellen als beibehaltene Tabellen) und Zeilen, die keine Übereinstimmung finden, werden als externe Zeilen zu VT2 hinzugefügt, wodurch VT3 generiert wird. Wenn die FROM-Klausel mehr als zwei Tabellen enthält, sind die durch den vorherigen Join generierten Ergebnisse Wiederholungsschritte 1 bis 3 für die nächste Tabelle, bis alle Tabellen verarbeitet sind.
WHERE: Nur Zeilen mit der Einstellung „true“ werden in VT4 eingefügt.
WHERE: Den WHERE-Filter auf VT3 anwenden Zeilen in VT4 gemäß der Spaltenliste in der GROUP BY-Klausel, um VT5 zu generieren.
CUBE|ROLLUP: Fügen Sie die Supergruppen (Suppergroups) in VT5 ein, um VT6 zu generieren.
HAVING: Auf VT6 HAVING-Filter anwenden
SELECT: Verarbeiten Sie die SELECT-Liste, wodurch VT8 entsteht.
ORDER BY: Sortieren Sie die Zeilen in VT9 durch die Spaltenliste in der ORDER BY-Klausel, um einen Cursor zu generieren (
TOP: Wählen Sie eine bestimmte Anzahl oder einen bestimmten Anteil von Zeilen vom Anfang von VC10 aus, um Tabelle VT11 zu generieren, und kehren Sie zum Aufrufer zurück
Hinweis: Schritt 10: Sortieren Sie die im vorherigen Schritt zurückgegebenen Zeilen gemäß der Spaltenliste in der ORDER BY-Klausel und geben Sie den Cursor VC10 zurück. Dieser Schritt ist der erste und einzige Schritt, der in der SELECT-Liste verwendet werden kann Dieser Schritt unterscheidet sich von den anderen Schritten darin, dass er keine gültige Tabelle, sondern einen Cursor zurückgibt. Die Menge ordnet ihre Zeilen nicht vor Für Sammlungen spielt die Reihenfolge der Mitglieder keine Rolle. Eine Abfrage, die eine Tabelle sortiert, kann ein Objekt zurückgeben, das in einer bestimmten physischen Reihenfolge organisiert ist.
Denn dieser Schritt ist wichtig Da keine Tabelle (sondern ein Cursor) zurückgegeben wird, können Abfragen, die die ORDER BY-Klausel verwenden, nicht als Tabellenausdrücke verwendet werden: Ansichten, Inline-Tabellenwertfunktionen, Unterabfragen, abgeleitete Tabellen und ein allgemeiner Ausdruck an die Clientanwendung, die einen physischen Datensatz erwartet. Beispielsweise ist die folgende abgeleitete Tabellenabfrage ungültig und generiert einen Fehler:
select *
Das obige ist der detaillierte Inhalt vonBeschreibung des SQL-Ausführungsprozesses. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!