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

Die Funktionen und Unterschiede zwischen deaktiviert und schreibgeschützt

1: schreibgeschützt dient zum Sperren dieses Steue...

Detaillierte Erklärung des Kopierobjekts von jQuery

<!DOCTYPE html> <html lang="de"...

Detaillierte Analyse der untergeordneten und übergeordneten Vue-Komponenten

Inhaltsverzeichnis 1. Übergeordnete Komponenten u...

Interaktion im Webdesign: Eine kurze Diskussion über Paging-Probleme

Funktion: Zur vorherigen Seite oder zur nächsten ...

MySQL-Fall bei der Verwendungsbeispielanalyse

Zuerst erstellen wir die Datenbanktabelle: Tabell...

Detailliertes Tutorial zum Aufbau eines lokalen Ideenaktivierungsservers

Vorwort Der Blogger verwendet die Idea IDE. Da di...

Zusammenfassung der wichtigsten Erkenntnisse des Vue-Entwicklungshandbuchs

Inhaltsverzeichnis Überblick 0. Grundlagen von Ja...

Implementierung des React Page Turner (inkl. Front- und Backend)

Inhaltsverzeichnis Frontend Entwerfen und schreib...

Detaillierte Erklärung von BOM und DOM in JavaScript

Inhaltsverzeichnis BOM (Browserobjektmodell) 1. F...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.27

Das Installationstutorial für MySQL 5.7.27 wird w...

JavaScript – Verwenden von Slots in Vue: Slot

Inhaltsverzeichnis Verwenden von Slots in Vue: Sl...

Tutorial zur Verwendung von Docker Compose zum Erstellen von Confluence

Dieser Artikel verwendet die Lizenzvereinbarung „...