MySQL 8.0 MIT Abfragedetails

MySQL 8.0 MIT Abfragedetails

Informationen zu WITH-Abfragen in MySQL 8

Vorwort:

Bei logisch komplexem SQL kann die Anzahl der temporären Tabellen erheblich reduziert und die Lesbarkeit und Wartbarkeit des Codes verbessert werden.
MySQL 8.0 unterstützt endlich die with-Anweisung. Für komplexe Abfragen ist es nicht mehr nötig, so viele temporäre Tabellen zu schreiben.
Sie können die offizielle Dokumentation einsehen [zum Springen klicken]

1. Beispiel

Aus dem ersten offiziellen Beispiel können wir ersehen, dass die Abfrageanweisung vier temporäre Tabellen erstellt: cte1 , cte2 , cte3 und cte4 Die letzteren temporären Tabellen hängen von den Daten der ersteren temporären Tabellen ab.
Die letzte Zeile ist das endgültige Abfrageergebnis. Tatsächlich enthält ct4 3 Datenzeilen, da ct3 Ergebnisse liefert, aber MAX und MIN werden verwendet, um eine Ergebniszeile zu erhalten.

MIT cte1(txt) AS (SELECT "Dieses "),
     cte2(txt) AS (SELECT CONCAT(cte1.txt,"ist ein ") FROM cte1),
     cte3(txt) AS (SELECT "nette Abfrage" UNION
                   SELECT "Abfrage, die rockt" UNION
                   SELECT "Abfrage"),
     cte4(txt) ALS (SELECT concat(cte2.txt, cte3.txt) VON cte2, cte3)
WÄHLEN SIE MAX(txt), MIN(txt) AUS cte4;
 
+----------------------------+----------------------+
| MAX(txt) | MIN(txt) |
+----------------------------+----------------------+
| Das ist eine tolle Abfrage. | Das ist eine nette Abfrage. |
+----------------------------+----------------------+
1 Zeile im Set (0,00 Sek.)

Das zweite offizielle Beispiel ist die Verwendung von Rekursion. Basierend auf der Lektüre der Dokumentation habe ich die folgenden Abfrageergebnisse analysiert.
Definieren Sie zunächst eine temporäre Tabelle my_cte
Analysieren Sie SELECT 1 AS n . Dadurch wird festgestellt, dass der Spaltenname der temporären Tabelle n ist und der Wert 1 ist.
Dann SELECT 1+n FROM my_cte WHERE n<10 , dies ist eine rekursive Abfrage n<10 , und 1+n wird als Ergebnis verwendet, um die temporäre Tabelle zu füllen. Schließlich wird SELECT * FROM my_cte verwendet, um die temporäre Tabelle abzufragen, sodass das Abfrageergebnis offensichtlich ist.

MIT REKURSIVEM my_cte AS
(
  WÄHLEN SIE 1 AS n
  UNION ALLE
  WÄHLEN SIE 1+n AUS my_cte, WO n<10
)
WÄHLEN SIE * AUS my_cte;
 
+------+
| n |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+------+
10 Zeilen im Set (0,00 Sek.)

Meinem Verständnis nach habe ich die folgenden zwei unterschiedlichen Abfragen geschrieben und die Abfrageergebnisse sind dieselben.
Es ist zu beachten, dass Anzahl und Typ mehrerer Abfragespalten in der temporären Tabelle identisch sein müssen, da sonst ein Fehler gemeldet wird.

Dies gibt den Spaltennamen der temporären Tabelle in der ersten Zeile an WITH RECURSIVE my_cte(a,b,c) AS
(
  WÄHLEN SIE 1,1,1
  UNION ALLE
  WÄHLEN SIE 1+a,2+b,3+c AUS my_cte, WO a<10
)
WÄHLEN SIE * AUS my_cte;
 
In der ersten Zeile werden keine Spaltennamen angegeben. Die Spaltennamen werden durch die Ergebnisse der ersten Abfrage WITH RECURSIVE my_cte AS bestimmt.
(
  WÄHLEN Sie 1 als a, 1 als b, 1 als c
  UNION ALLE
  WÄHLEN SIE 1+a,2+b,3+c AUS my_cte, WO a<10
)
WÄHLEN SIE * AUS my_cte;

Laut der offiziellen Dokumentation sieht die Syntaxvorlage für eine temporäre Tabelle wie folgt aus, die aus Abfragen mit vielen Zeilen bestehen kann.

WITH RECURSIVE cte_name [Liste der Spaltennamen] AS
(
  SELECT ... <-- gibt den Anfangssatz an
  UNION ALLE
  SELECT ... <-- gibt den Anfangssatz an
  UNION ALLE
  ...
  SELECT ... <-- gibt an, wie neue Zeilen abgeleitet werden
  UNION ALLE
  SELECT ... <-- gibt an, wie neue Zeilen abgeleitet werden
  ...
)
[, eine beliebige Anzahl anderer CTE-Definitionen]

Das offizielle Dokument führt auch auf, dass Sie bei Verwendung temporärer Tabellen neue Tabellen hinzufügen, löschen, ändern und abfragen können. Weitere Einzelheiten finden Sie im offiziellen Dokument.

3. Üben

Rekursive Übungen werden hauptsächlich für Tabellen verwendet, die übergeordnete Knoten-IDs usw. enthalten. Einzelheiten finden Sie in den folgenden Übungen.
Definieren Sie die folgende Tabelle, um die ID, den Namen und die PID jeder Region (Provinz, Stadt, Bezirk) zu speichern.

 
Tabelle erstellen tb (ID VARCHAR (3), PID VARCHAR (3), Name VARCHAR (64));
 
INSERT INTO tb VALUES('002', 0, 'Provinz Zhejiang');
INSERT INTO tb VALUES('001', 0, 'Provinz Guangdong');
INSERT INTO tb VALUES('003', '002', 'Stadt Quzhou');
INSERT INTO tb VALUES('004', '002', 'Hangzhou');
INSERT INTO tb VALUES('005', '002', 'Stadt Huzhou');
INSERT INTO tb VALUES('006', '002', 'Stadt Jiaxing');
INSERT INTO tb VALUES('007', '002', 'Ningbo-Stadt');
INSERT INTO tb VALUES('008', '002', 'Stadt Shaoxing');
INSERT INTO tb VALUES('009', '002', 'Stadt Taizhou');
INSERT INTO tb VALUES('010', '002', 'Stadt Wenzhou');
INSERT INTO tb VALUES('011', '002', 'Stadt Lishui');
INSERT INTO tb VALUES('012', '002', 'Stadt Jinhua');
INSERT INTO tb VALUES('013', '002', 'Stadt Zhoushan');
INSERT INTO tb VALUES('014', '004', 'Uptown');
INSERT INTO tb VALUES('015', '004', 'Innenstadt');
INSERT INTO tb VALUES('016', '004', 'Bezirk Gongshu');
INSERT INTO tb VALUES('017', '004', 'Bezirk Yuhang');
INSERT INTO tb VALUES('018', '011', 'Bezirk Jindong');
INSERT INTO tb VALUES('019', '001', 'Guangzhou');
INSERT INTO tb VALUES('020', '001', 'Stadt Shenzhen');
 
MIT REKURSIVEM cte AS (
 Wählen Sie ID, Name aus tb, wobei ID = '002' ist.
 UNION ALLE
 Wählen Sie k.id, CONCAT (c.name, '->', k.name) als Name von tb k INNER JOIN cte c auf c.id = k.pid
) AUSWÄHLEN * VON cte;

Ausführungsergebnis:

Das Analyseergebnis umfasst die Daten der ersten Zeile SELECT id,name FROM tb WHERE id='002' . Zu diesem Zeitpunkt enthält die Tabelle nur eine Datenzeile. Anschließend wird die Tabelle verknüpft und SELECT k.id, CONCAT(c.name,'->',k.name) AS name FROM tb k INNER JOIN cte c ON c.id = k.pid wird abgefragt. Die Daten des übergeordneten Knotens werden rekursiv in die temporäre Tabelle eingefügt und die endgültige Abfrage ist das rekursive Ergebnis.

Dies ist das Ende dieses Artikels über MySQL WITH-Abfragedetails. Weitere relevante MySQL WITH-Abfrageinhalte finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung zur Verwendung von with...as in MySQL

<<:  HTML-Formularanwendung beinhaltet die Verwendung von Kontrollkästchen und Optionsfeldern

>>:  Eine kurze Erklärung zum sinnvollen Einsatz von Tabellen und Divs im Seitendesign

Artikel empfehlen

Einführung in die Eigenschaften von B-Tree

B-Baum ist eine allgemeine Datenstruktur. Daneben...

Ausführliches Tutorial zur Installation und Konfiguration von MySQL 8.0.20

In diesem Artikel finden Sie eine ausführliche An...

NestJs verwendet Mongoose zum Betrieb von MongoDB

Ich habe vor Kurzem angefangen, das NestJs-Framew...

Schnelle Lösung zum Vergessen des MySQL8-Passworts

Vorwort Wenn wir das MySQL-Datenbankkennwort verg...

Vue implementiert die richtige Slide-Out-Layer-Animation

In diesem Artikelbeispiel wird der spezifische Co...

MariaDB-Serverinstallation der MySQL-Reihe

Inhaltsverzeichnis Tutorial-Reihe 1. Installieren...

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort vergessen?

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort ve...

Zusammenfassung der XHTML-Tags auf Blockebene

* Adresse - Adresse * Blockzitat - Blockzitat * Mi...

Tipps zum Erstellen zweidimensionaler Arrays in JavaScript

Erstellen eines zweidimensionalen Arrays in Js: Z...

js kehrt zur vorherigen Seite zurück und aktualisiert den Code

1. Javascript kehrt zur vorherigen Seite zurück hi...