Heim  >  Artikel  >  Backend-Entwicklung  >  Beschreibung des SQL-Ausführungsprozesses

Beschreibung des SQL-Ausführungsprozesses

巴扎黑
巴扎黑Original
2017-09-06 11:11:181110Durchsuche

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) JOIN

(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 wahr ist, werden in VT2 eingefügt.
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 wird in VT7 eingefügt.
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 *

from(select orderid,customerid fromorders Bestellung nach Bestell-ID)

wie d

Die folgende Ansicht erzeugt ebenfalls einen Fehler

Ansicht erstellen meine_Ansicht

wie

wählen *

von Aufträgen

Reihenfolge nach Bestell-ID

In SQL sind Abfragen mit ORDER BY-Klauseln in Tabellenausdrücken nicht zulässig, es gibt jedoch eine Ausnahme in T-SQL (bei Anwendung von TOP-Option).

Denken Sie also daran, keine bestimmte Reihenfolge für die Zeilen in der Tabelle anzunehmen. Mit anderen Worten: Geben Sie keine ORDER BY-Klausel an, es sei denn, Sie sind sicher, dass die Zeilen sortiert werden sollen. Das Sortieren ist mit Kosten verbunden, und SQL Server muss einen geordneten Indexscan durchführen oder einen Sortieroperator verwenden.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn