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.
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:
|
<<: Zusammenfassung von sieben in JavaScript implementierten Sortieralgorithmen (empfohlen!)
>>: Detaillierte Erläuterung der Windows-Zeitserver-Konfigurationsmethode
Überblick Der grundlegende Unterschied zwischen a...
1. Warum wird das Auswerfen nicht empfohlen? 1. W...
Kernel: [root@opop ~]# cat /etc/centos-release Ce...
Finden Sie das Problem Ich habe kürzlich den Spei...
Szenario Eine aktuelle Anforderung ist eine h5-Se...
1. Laden Sie die beschleunigte Version von msyql ...
Dies ist eigentlich kein offizielles Dokument des ...
Installieren Sie CentOS 7 nach der Installation v...
Inhaltsverzeichnis Hintergrund: Reibungslose Upgr...
<br />So entfernen Sie die Trennlinien einer...
Inhaltsverzeichnis Props-Vergleich von Klassenkom...
Herstellen einer Verbindung mit MySQL Hier verwen...
Inhaltsverzeichnis 1. MySQL-Datensicherung 1.1. m...
Inhaltsverzeichnis 1. Document.execCommand()-Meth...
Inhaltsverzeichnis Vorwort: 1. Konzept 2. Die Vor...