Eine kleine Frage zur Ausführungsreihenfolge von SQL in MySQL

Eine kleine Frage zur Ausführungsreihenfolge von SQL in MySQL

Ich bin heute bei der Arbeit auf ein SQL-Problem gestoßen, das sich auf Left Join bezog. Obwohl es später gelöst wurde, habe ich durch dieses Problem etwas über die Ausführungsreihenfolge von SQL erfahren.

Szenenwiederherstellung

Um Sicherheitsstreitigkeiten zu vermeiden, simulieren Sie das Szenario.

Es gibt eine Schülertabelle - S, eine Notentabelle G

CREATE TABLE `test_student` (
 `id` bigint(20) NOT NULL COMMENT 'Matrikelnummer',
	`sex` TINYINT DEFAULT '0' COMMENT 'Geschlecht 0-Männlich 1-Weiblich',
 `Name` varchar(255) STANDARD NULL KOMMENTAR 'Name'
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='Studententabelle';
 
CREATE TABLE `test_score` (
 `id` bigint(20) NOT NULL COMMENT 'Matrikelnummer',
 `score` int NICHT NULL KOMMENTAR 'score',
	`level` TINYINT COMMENT 'Note 0-nicht bestanden 1-bestanden 2-gut 3-ausgezeichnet'
) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='Punktetabelle';
 
-- Initialisieren Sie die Studenten INSERT INTO test_student VALUES(1, 0, 'Student'), (2, 0, 'Student'), (3, 1, 'Studenten');
- Initialisieren Sie die Ergebnisse INSERT INTO test_score VALUES(1, 10, 0), (2, 20, 0), (3, 100, 3);

Jetzt besteht die Nachfrage, die Testergebnisse des Schülers herauszufinden. Mögliche SQL

WÄHLEN Sie ts.name AS 'Name', tc.score AS 'Punktzahl'
VON test_student ts
LINKS JOIN test_score tc
EIN ts.id = tc.s_id;

Alles lief gut. Plötzlich, kurz nach der Prüfung, kam ein Student herein.

INSERT INTO test_student VALUES(4, 0, 'Neuling');

Er hat keine Ergebnisse, oder die SQL-Abfrage gerade

Was soll ich tun, wenn der Lehrer nur die Ergebnisse der Schüler sehen muss, die die Prüfung abgelegt haben?

1. Verwenden Sie Inner Join

WÄHLEN Sie ts.name AS 'Name', tc.score AS 'Punktzahl'
VON test_student ts
INNER JOIN test_score tc
EIN ts.id = tc.s_id;

2. Bedingte Filterung hinzufügen

WÄHLEN Sie ts.name AS 'Name', tc.score AS 'Punktzahl'
VON test_student ts
LINKS JOIN test_score tc
EIN ts.id = tc.s_id
UND tc.score ist NICHT NULL
;

Ich habe festgestellt, dass das Hinzufügen einer bedingten Filterung immer noch nicht korrekt ist. Äh, wie wäre es, stattdessen „where“ zu verwenden?

WÄHLEN Sie ts.name AS 'Name', tc.score AS 'Punktzahl'
VON test_student ts
LINKS JOIN test_score tc
EIN ts.id = tc.s_id
WO tc.score NICHT NULL ist
;

Bingo, warum ist dann wo richtig?

Dabei geht es um die Ausführungsreihenfolge von SQL

wo und mach mit

Aus dem obigen Beispiel folgt

Dabei werden aus dem Ergebnissatz die Datensätze herausgefiltert, die die Bedingungen erfüllen, und diejenigen verworfen, die die Bedingungen nicht erfüllen.

Join-Operation: Manchmal müssen wir Ergebnisse aus zwei oder mehr Tabellen abrufen, um ein vollständiges Ergebnis zu erhalten. Wir müssen den Join ausführen.

Zusätzlich zum INNER JOIN, den wir im obigen Beispiel verwendet haben, gibt es mehrere andere Joins, die wir verwenden können.

Nachfolgend finden Sie eine Liste der verwendbaren JOIN-Typen und der Unterschiede zwischen ihnen.

  • JOIN: Gibt Zeilen zurück, wenn mindestens eine Übereinstimmung in der Tabelle vorhanden ist
  • LEFT JOIN: Gibt alle Zeilen aus der linken Tabelle zurück, auch wenn es in der rechten Tabelle keine Übereinstimmungen gibt
  • RIGHT JOIN: Gibt alle Zeilen aus der rechten Tabelle zurück, auch wenn es in der linken Tabelle keine Entsprechung gibt
  • FULL JOIN: Gibt Zeilen zurück, solange eine Übereinstimmung in einer der Tabellen vorliegt (wird von MySQL nicht unterstützt, Sie können die Implementierung über Ansichten durchführen)

Hier ist ein einfaches und leicht verständliches Tutorial zum Beitritt zu SQL.

SQL-Reihenfolge

Aus dem Obigen können wir ersehen, dass in SQL „on“ vor der Where-Bedingung steht. Wenn die Datenbank-Engine SQL analysiert und ausführt, steht dann „on“ auch vor „where“?

Allgemeine SQL-Schreibreihenfolge

1.SELECT [Spaltenname* steht für alle Spalten]

2.FROM [Tabellenname]

3.join_type JOIN [Tabellenname]

4.ON [Joinbedingung]

5.WHERE [Filterbedingung]

6. GROUP BY [Gruppierungsfeld]

7. HAVING [Gruppierungsbedingung]

8.ORDER BY [Sortierfeld]

In welcher Reihenfolge wird SQL ausgeführt?

Die Standardreihenfolge für die SQL-Analyse ist:

1. FROM fasst Daten aus verschiedenen Datenquellen (Tabellen) zusammen

2.WHERE Datensätze basierend auf Bedingungen filtern

3. GROUP BY gruppiert Daten

4. Berechnen Sie Aggregatfunktionen wie Durchschnitt, Summe

5. Verwenden Sie die HAVING-Klausel zum Filtern von Gruppen

6. Berechnen Sie alle Ausdrücke

7. Verwenden Sie ORDER BY, um die Ergebnisse zu sortieren

Wie ist also die Ausführungsreihenfolge von SQL?

1.FROM: Führen Sie das kartesische Produkt auf den ersten beiden Tabellen aus, um die virtuelle Tabelle vt1 zu generieren

2.ON: Wenden Sie die Ein-Bedingung auf vt1 an. Nur diejenigen, die die Join-Bedingung erfüllen, können in die virtuelle Tabelle vt2 eingefügt werden.

3. OUTER (Join): Wenn OUTER JOIN angegeben ist, werden Zeilen, die in der beibehaltenen Tabelle nicht gefunden wurden, als externe Zeilen zu vt2 hinzugefügt, wodurch t3 generiert wird. Wenn from mehr als zwei Tabellen enthält, wiederholen Sie die Schritte 1 und 2 für die Ergebnistabelle, die durch den vorherigen Join und die nächste Tabelle generiert wurde, und beenden Sie dann direkt.

4.WHERE: Führen Sie einen Where-Filter auf vt3 aus, und nur diejenigen, die die Where-Bedingung erfüllen, können in vt4 eingefügt werden

5.GROUP BY: Gruppieren Sie vt4 nach dem Feld „Group By“, um vt5 zu erhalten

6.HAVING: Wenden Sie den HAVING-Filter auf vt5 an und fügen Sie nur Gruppen in vt6 ein, die having_condition wahr machen

7.SELECT: Verarbeiten Sie die Auswahlliste, um vt7 zu generieren

8.DISTINCT: Entfernen Sie doppelte Zeilen aus vt7, um vt8 zu generieren

9.ORDER BY: Sortieren Sie die Zeilen von vt8 nach der Spaltenliste in der Order-By-Klausel, um einen Cursor vc9 zu generieren

10.LIMIT (MySQL): Wählen Sie eine bestimmte Anzahl von Zeilen vom Anfang von vc9 aus, um vt10 zu generieren und an den Anrufer zurückzugeben

An diesem Punkt sollten Sie feststellen, dass es nicht einfach ist, gutes SQL zu schreiben. Wenn Sie jedoch die Ausführungsreihenfolge von SQL verstehen, können Sie während der Entwicklung bessere Programme schreiben.

Beispielsweise kann es nicht zu viele Verknüpfungstabellen geben ( filtern Sie zuerst die Bedingungen, verbinden Sie dann die Tabellen und erstellen Sie Indizes für verwandte Abfragefelder in den Tabellen. Dadurch wird die Abfrage mehrerer Tabellen in Big Data viel schneller ). Ich werde diese Art von SQL-Optimierungsproblem beim nächsten Mal untersuchen und lösen.

Übe es!

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:
  • Beispielanalyse der Ausführungsreihenfolge und Schreibreihenfolge von MySQL-Anweisungen
  • Beispielanalyse der MySQL-Codeausführungsstruktur [Sequenz-, Verzweigungs-, Schleifenstruktur]
  • Verstehen Sie einfach die Schreib- und Ausführungsreihenfolge von MySQL-Anweisungen
  • Ein kurzes Verständnis der MySQL SELECT-Ausführungsreihenfolge
  • Detaillierte Erläuterung der Ausführung von SQL-Anweisungen (Übersicht über die MySQL-Architektur -> Abfrageausführungsprozess -> SQL-Analysereihenfolge)
  • Analyse der Anweisungsausführungsreihenfolge von SQL und MySQL
  • Eine kurze Erläuterung des MySQL-Ausführungsprozesses und der MySQL-Ausführungssequenz

<<:  Zusammenfassung von sieben in JavaScript implementierten Sortieralgorithmen (empfohlen!)

>>:  Detaillierte Erläuterung der Windows-Zeitserver-Konfigurationsmethode

Artikel empfehlen

JS Asynchronous Stack Tracing: Warum „await“ besser ist als „Promise“

Überblick Der grundlegende Unterschied zwischen a...

Installationsprozess des mysql5.6.8-Quellcodes

Kernel: [root@opop ~]# cat /etc/centos-release Ce...

Detaillierte Analyse von GUID-Anzeigeproblemen in Mongodb

Finden Sie das Problem Ich habe kürzlich den Spei...

Alibaba Cloud ESC Server Docker-Bereitstellung von Single Node Mysql

1. Laden Sie die beschleunigte Version von msyql ...

Referenz zur Webseitenerstellung im IE6 - Standardstil im IE6

Dies ist eigentlich kein offizielles Dokument des ...

So entfernen Sie die Trennlinie einer Webseitentabelle

<br />So entfernen Sie die Trennlinien einer...

Ein kurzer Vergleich von Props in React

Inhaltsverzeichnis Props-Vergleich von Klassenkom...

Docker stellt eine MySQL-Remoteverbindung bereit, um 2003-Probleme zu lösen

Herstellen einer Verbindung mit MySQL Hier verwen...

So verwenden Sie die Clipboard-API in JS

Inhaltsverzeichnis 1. Document.execCommand()-Meth...

JavaScript-Modularität erklärt

Inhaltsverzeichnis Vorwort: 1. Konzept 2. Die Vor...