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

Gemessenes Bild - HTTP-Anforderung

Bitte öffnen Sie die Testseite in einem gängigen ...

Regeln für die Verwendung gemeinsamer MySQL-Indizes

Ein gemeinsamer Index wird auch als zusammengeset...

Anwendungsbeispiel-Tutorial zum Schlüssel-Rendering in Vue

Einführung Während des Front-End-Projektentwicklu...

Erläuterung des Arbeitsmechanismus von Namenode und SecondaryNameNode in Hadoop

1) Prozess 2) FSImage und Bearbeitungen Nodenode ...

So installieren Sie PostgreSQL11 auf CentOS7

Installieren Sie PostgreSQL 11 auf CentOS 7 Postg...

So verwenden Sie den VIM-Editor unter Linux

Als leistungsstarker Editor mit umfangreichen Opt...

Detaillierte Erläuterung des MySql-Beispiels für automatische Kürzung

Detaillierte Erläuterung des MySql-Beispiels für ...

Was sind die Vorteile von MySQL MGR?

MGR (MySQL Group Replication) ist eine neue Funkt...

Zusammenfassung der Berechtigungsprobleme bei gespeicherten MySQL-Prozeduren

Ja, gespeicherte MySQL-Prozeduren scheinen sehr s...

Natives JavaScript-Message Board

In diesem Artikel wird der spezifische JavaScript...