Lernen Sie die Ausführungsreihenfolge von SQL-Abfragen von Grund auf

Lernen Sie die Ausführungsreihenfolge von SQL-Abfragen von Grund auf

Die Ausführungsreihenfolge der SQL-Abfrageanweisungen lautet wie folgt:

(7) AUSWÄHLEN 
(8) DISTINCT <Auswahlliste>
(1) FROM <linke_Tabelle>
(3) <join_type> JOIN <rechte_Tabelle>
(2) ON <Beitrittsbedingung>
(4) WHERE <Wo_Bedingung>
(5) GRUPPE NACH <Gruppenliste>
(6) HAVING <Haben_Bedingung>
(9) ORDER BY <order_by_condition>
(10) LIMIT <Grenzwert>

Vorbereitende Maßnahmen

1. Erstellen Sie eine neue Testdatenbank

Datenbanktestdaten erstellen;

2. Erstellen Sie eine Testtabelle und fügen Sie Daten wie folgt ein:

Benutzertabelle


Bestellformular


Vorbereiten von Testanweisungen für logische SQL-Abfragen

Wählen Sie a.user_id,COUNT(b.order_id) als total_orders
FROM Benutzer als
LEFT JOIN-Aufträge als b
EIN a.Benutzer-ID = b.Benutzer-ID
WO a.city = "Peking"
GROUP BY a.Benutzer-ID
HAVING COUNT(b.Bestell-ID) < 2
ORDER BY total_orders desc

Verwenden Sie die obige SQL-Abfrage, um Kunden aus Peking zu erhalten, die weniger als 2 Bestellungen haben;

Während der Ausführung dieser SQL-Anweisungen wird eine virtuelle Tabelle generiert, um die Ausführungsergebnisse der SQL-Anweisungen zu speichern.

1. Führen Sie die FROM-Anweisung aus

Der erste Schritt besteht darin, die FROM -Anweisung auszuführen. Wir müssen zunächst wissen, mit welcher Tabelle wir beginnen, und das sagt uns FROM . Wir haben jetzt zwei Tabellen, <left_table> und <right_table> . Mit welcher Tabelle sollen wir beginnen, oder sollen wir beginnen, nachdem wir eine Verbindung zwischen den beiden Tabellen hergestellt haben? In welcher Beziehung stehen sie zueinander? — Kartesisches Produkt

Nachdem die FROM-Anweisung ein kartesisches Produkt auf den beiden Tabellen ausgeführt hat, wird eine virtuelle Tabelle, VT1 (virtuelle Tabelle 1), mit folgendem Inhalt erhalten:


Es gibt insgesamt 28 (Anzahl der Benutzerdatensätze * Anzahl der Bestelldatensätze) Datensätze. Dies ist das Ergebnis von VT1. Die folgenden Operationen basieren auf VT1.

2. ON-Filterung durchführen

Nach der Ausführung des kartesischen Produkts wird dann ON a.user_id = b.user_id durchgeführt. Gemäß den in ON angegebenen Bedingungen werden die Daten, die die Bedingungen nicht erfüllen, entfernt und VT2 wird wie folgt erhalten:

Wählen Sie * vom Benutzer als inneren JOIN-Auftrag als b ON a.user_id = b.user_id; 


3. Externe Zeilen hinzufügen

Dieser Schritt wird nur ausgeführt, wenn der Verknüpfungstyp OUTER JOIN ist, also etwa LEFT OUTER JOIN , RIGHT OUTER JOIN und FULL OUTER JOIN . Meistens lassen wir das Schlüsselwort OUTER weg, aber OUTER stellt das Konzept externer Zeilen dar.

LEFT OUTER JOIN kennzeichnet die linke Tabelle als reservierte Tabelle: Das heißt, alle Daten in der linken Tabelle werden abgefragt, und wenn in der rechten Tabelle keine entsprechenden Daten vorhanden sind, werden diese mit NULL aufgefüllt:


RIGHT OUTER JOIN kennzeichnet die rechte Tabelle als reservierte Tabelle: Das heißt, alle Daten in der rechten Tabelle werden abgefragt, und wenn in der linken Tabelle keine entsprechenden Daten vorhanden sind, werden diese mit NULL ergänzt.


FULL OUTER JOIN verwendet sowohl linke als auch rechte Tabellen als reservierte Tabellen, MySQL unterstützt jedoch keine vollständigen Joins. Sie können vollständige Joins auf folgende Weise implementieren:

Da ich in der vorbereiteten Test-SQL-Abfragelogikanweisung LEFT JOIN verwendet habe, sieht die resultierende VT3-Tabelle wie folgt aus:


4. Führen Sie die Where-Bedingungsfilterung aus

Die Daten mit den hinzugefügten externen Zeilen werden durch die Where-Bedingung gefiltert. Nur die Datensätze, die die Bedingung <where_condition> erfüllen, werden herausgefiltert. Führen Sie WHERE a.city = 'beijing' aus, um VT4 wie folgt zu erhalten:


Allerdings müssen bei der Verwendung der WHERE-Klausel folgende zwei Punkte beachtet werden:

1. Da die Daten noch nicht gruppiert wurden, können Sie where_condition=MIN(col) nicht in der Where-Filterbedingung verwenden, um Gruppenstatistiken zu filtern.

2. Da die Spaltenauswahloperation nicht durchgeführt wurde, ist die Verwendung von Spaltenaliasen in der Auswahl ebenfalls nicht zulässig. Wählen Sie beispielsweise „Stadt als c“ aus Tabelle1 aus, wobei c=„Peking“ nicht zulässig ist.

5. Führen Sie die Group-By-Anweisung aus

GROU BY -Klausel wird hauptsächlich verwendet, um die mithilfe der WHERE Klausel erhaltene virtuelle Tabelle zu gruppieren. Führen Sie GROUP BY a.user_id aus, um VT5 wie folgt zu erhalten:


6. Durchführung von

Die HAVING Klausel wird hauptsächlich in Verbindung mit GROUP BY Klausel verwendet, um eine bedingte Filterung der durch Gruppierung erhaltenen Daten von VT5 durchzuführen. Führen Sie HAVING COUNT(b.order_id) < 2 aus, um VT6 wie folgt zu erhalten:


7. Liste auswählen

Die SELECT Klausel wird erst jetzt ausgeführt. Gehen Sie nicht davon aus, dass SELECT Klausel als erste ausgeführt wird, nur weil sie in der ersten Zeile steht.

Wir führen SELECT a.user_id,user_name,COUNT(b.order_id) as total_orders in der Testanweisung aus, wählen den benötigten Inhalt aus VT6 aus und erhalten VT7 wie folgt:


8. Führen Sie distinct aus, um Daten zu deduplizieren

Wenn in der Abfrage die DISTINCT Klausel angegeben ist, wird eine temporäre In-Memory-Tabelle erstellt (wenn sie nicht in den Speicher passt, muss sie auf der Festplatte gespeichert werden). Die Tabellenstruktur dieser temporären Tabelle ist dieselbe wie die der im vorherigen Schritt generierten virtuellen Tabelle. Der Unterschied besteht darin, dass der Spalte für die DISTINCT-Operation ein eindeutiger Index hinzugefügt wird, um doppelte Daten zu vermeiden. Das Test-SQL enthält keine DISTINCT Klausel und wird daher nicht ausgeführt.

9. Führen Sie den Auftrag per Klausel aus

Sortieren Sie den Inhalt der virtuellen Tabelle VT7 nach der angegebenen Spalte und geben Sie dann eine neue virtuelle Tabelle zurück. Wir führen ORDER BY total_orders DESC in der Test-SQL-Anweisung aus und erhalten die folgenden Ergebnisse:

DESC sortiert absteigend, ASC sortiert aufsteigend


10. Führen Sie die Limit-Anweisung aus

Die LIMIT-Klausel wählt die angegebenen Zeilendaten beginnend an der angegebenen Position aus der im vorherigen Schritt erhaltenen virtuellen Tabelle aus, die häufig zum Paginieren verwendet wird.

LIMIT der MySQL-Datenbank unterstützt die folgenden Optionen: limit n,m

Gibt an, dass m Datensätze ausgewählt werden, beginnend mit dem n-ten Datensatz. Bei kleinen Datenmengen ist die Verwendung der LIMIT-Klausel kein Problem. Bei sehr großen Datenmengen ist die Verwendung von LIMIT n, m jedoch sehr ineffizient. Da der LIMIT-Mechanismus jedes Mal von Anfang an scannt, müssen Sie, wenn Sie 3 Daten ab der 600.000. Zeile lesen müssen, zuerst bis zur 600.000. Zeile scannen und diese dann lesen. Der Scanvorgang ist ein sehr ineffizienter Prozess.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Ein Beispiel für die Verwendung von PHP zur gleichzeitigen Ausführung mehrerer SQL-Abfrageanweisungen mit mysqli
  • Ein Artikel zum Verständnis des Ausführungsprozesses von MySQL-Abfrageanweisungen
  • Analysieren Sie, wie eine SQL-Abfrageanweisung in MySQL ausgeführt wird
  • Detaillierte Erläuterung der Schreibreihenfolge und Ausführungsreihenfolge von SQL-Abfrageanweisungen der MySQL-Reihe
  • Wie wird eine SQL-Abfrage in MySQL ausgeführt?
  • Ausführungsprozess der SQL-Abfrageanweisung

<<:  Detaillierte Erklärung des Prinzips der Docker-Image-Schichtung

>>:  Beispiel für die Verwendung von rem zum Ersetzen von px in einem Vue-Projekt

Artikel empfehlen

Grafisches Tutorial zu MySQL-Downloads und Installationsdetails

1. Um die MySQL-Datenbank herunterzuladen, besuch...

Vue implementiert die Produktregisterkarte der Produktdetailseitenfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Der Prozess der Installation von SVN auf Ubuntu 16.04.5LTS

Dieser Artikel stellt kurz den Prozess der Einric...

So verwenden Sie einen Gamecontroller in CocosCreator

Inhaltsverzeichnis 1. Szenenlayout 2. Fügen Sie e...

Beispielcode für Nginx zur Erreichung dynamischer und statischer Trennung

1. Einfache Konfiguration der dynamischen und sta...

Semantisierung von HTML-Tags (einschließlich H5)

einführen HTML stellt die kontextuelle Struktur u...

Ein kurzes Verständnis des Unterschieds zwischen MySQL Union All und Union

Union ist eine Vereinigungsoperation für die Date...

So zeigen Sie JSON-Daten auf einer HTML-Seite an und formatieren sie

JSON-Daten werden auf der HTML-Seite angezeigt un...

Übersicht über MySQL-Statistiken

MySQL führt SQL durch den Prozess der SQL-Analyse...

So fügen Sie CentOS7 systemd benutzerdefinierte Systemdienste hinzu

systemd: Das Service-Systemctl-Skript von CentOS ...

Mysql SQL-Anweisungsvorgang zum Hinzufügen oder Ändern des Primärschlüssels

Tabellenfelder hinzufügen alter table table1 add ...

Ein seltener Fehler und eine Lösung für die vollständige SQL Server-Sicherung

1. Fehlerdetails Als ich einmal manuell eine voll...