Die Top Drei entsprechen so ziemlich meinen Erwartungen, und zwar: 1. Cursor 2. Fensterfunktion 3. Clustered-Index Obwohl diese drei Punkte im täglichen Leben selten verwendet werden, Heute möchte ich mit Ihnen über Fensterfunktionen sprechen. Okay, ohne weitere Umschweife beginnen wir wie üblich mit der Vorspeise und schauen uns die Daten der heutigen Testtabelle an. Die in diesem Artikel zur Demonstration verwendete Testtabelle ist mysql> AUSWÄHLEN * von chh_baozipu; +----+--------------------+-------+---------+ | ID | Produkt | Umsatz | Monat | +----+--------------------+-------+---------+ | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | | 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | | 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | | 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | | 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | | 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | | 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | +----+--------------------+-------+---------+ 12 Zeilen im Satz (0,00 Sek.) Wie sagt man es? Kommen Sie einmal in meinen Laden und ich verwöhne Sie alle mit mit Weizen gefüllten Brötchen. 1. Was ist eine Fensterfunktion?1. Wie ist das Fenster zu verstehen? Tatsächlich ist das Konzept des Nehmen wir die Testtabelle als Beispiel und erstellen einige Statistiken: SELECT *,SUM(Umsatz) über(ORDER BY „Monat“) als kumulativen Gewinn von chh_baozipu, wobei Produkt=„Brötchen mit Schweinefleisch und Frühlingszwiebeln“; mysql> SELECT *,SUM(Umsatz) über(ORDER BY „Monat“) als kumulierter Gewinn von chh_baozipu, wobei Produkt=„Brötchen mit Schweinefleisch und Frühlingszwiebeln“; +----+--------------------+-------+---------+--------------+ | ID | Produkt | Umsatz | Monat | kumulierter Gewinn| +----+--------------------+-------+---------+--------------+ | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 2600 | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 3400 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 4400 | | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 6000 | | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 6600 | +----+--------------------+-------+---------+--------------+ 6 Zeilen im Satz (0,00 Sek.) Aus dieser SQL-Anweisung können wir ersehen, dass Es ist ersichtlich Für jeden Datensatz muss innerhalb dieses Fensters eine Funktion ausgeführt werden. Bei manchen Funktionen ist die Fenstergröße abhängig vom Datensatz festgelegt, es handelt sich also um 2. Was ist eine Fensterfunktion?
In welchen Szenarien werden Fensterfunktionen am häufigsten verwendet? Es gibt zwei Hauptkategorien:
Unsere gängigen Fensterfunktionen und Aggregatfunktionen sind:
Da Aggregatfunktionen auch in Fensterfunktionen verwendet werden können, werden Fensterfunktionen und normale Aggregatfunktionen leicht verwechselt. Die Unterschiede zwischen den beiden sind wie folgt:
2. Verwendung von FensterfunktionenGrundlegende Syntax: <Fensterfunktion> OVER (PARTITION BY <Spaltenname für Gruppierung> ORDER BY <Spaltenname für Sortierung>); -- Das Schlüsselwort „over“ wird verwendet, um den Fensterbereich der Funktion anzugeben. --Partitionierung wird zum Gruppieren von Tabellen verwendet. -- Die Order-By-Klausel wird zum Sortieren der gruppierten Ergebnisse verwendet.
Was sind die Fensterfunktionen? Ich bin zu faul zum Zeichnen, also leihe ich mir die Karte von
Schauen wir uns einige Beispiele an: 1. Ordinalfunktion: row_number() / rank() / dense_rank()ROW_NUMBER(): Sequentielle Sortierung - 1, 2, 3 RANK(): Parallel sortieren, doppelte Zahlen überspringen - 1, 1, 3 DENSE_RANK(): parallele Sortierung, ohne doppelte Zahlen zu überspringen - 1, 1, 2 mysql> SELECT *,ROW_NUMBER() over(ORDER BY sales desc) as pro_ROW_NUMBER,rank() over(ORDER BY sales desc) as pro_rank,DENSE_RANK() over(ORDER BY sales desc) as pro_DENSE_RANK from chh_baozipu where product='Brötchen mit Schweinefleisch und Frühlingszwiebeln'; +----+--------------------+-------+---------+----------------+----------+----------------+ | ID | Produkt | Umsatz | Monat | pro_ROW_NUMBER | pro_rank | pro_DENSE_RANK | +----+--------------------+-------+---------+----------------+----------+----------------+ | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 1 | 1 | 1 | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 2 | 1 | 1 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 3 | 3 | 2 | | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 4 | 3 | 2 | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 5 | 5 | 3 | | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 6 | 6 | 4 | +----+--------------------+-------+---------+----------------+----------+----------------+ 6 Zeilen im Satz (0,00 Sek.) Wie aus den obigen Beispielen ersichtlich ist, erfüllen die drei Fensterfunktionen drei verschiedene typische Geschäftsanforderungen, die für die Handhabung unserer Sortierstatistiken ausreichen. Wenn Studierende in Zukunft in Interviews oder schriftlichen Tests gefragt werden, sprechen Sie bitte nicht über Low-Level-Lösungen wie Self-Query-Nesting, andernfalls sagen Sie nicht, dass Sie mich kennen ~ Hunde 2. Verteilungsfunktion: percent_rank() / cume_dist()Da diese Verteilungsfunktion grundsätzlich nicht genutzt wird, gehen wir hier nicht näher darauf ein. Interessierte Studenten können Baidu selbst durchsuchen ~ 3. Vorher- und Nachher-Funktion: lag(expr,n) / lead(expr,n)
Die Funktionen „Before“ und „After“ werden häufig verwendet, um den Wert von expr in Anwendungsszenario: Abfrage der Differenz zwischen den Punktzahlen der besten n Schüler und der Punktzahl des aktuellen Schülers Das innere SQL verwendet zuerst die Funktion LAG(), um die Punktzahl des vorherigen Schülers zu ermitteln, und das äußere SQL subtrahiert dann die Punktzahlen des aktuellen Schülers und des vorherigen Schülers, um die Punktzahldifferenz zu erhalten. Es wäre etwas umständlich, hier die Testtabelle von Ha Ge zu verwenden. . Aber du weißt bestimmt, was ich meine. Schauen wir es uns an: mysql> SELECT *, lag(Umsatz,1) über Gewinn als pro_lag, lead(Umsatz,1) über Gewinn als pro_lead von chh_baozipu WINDOW Gewinn als (PARTITION BY Produkt ORDER BY Umsatz desc); +----+--------------------+-------+---------+---------+----------+ | ID | Produkt | Umsatz | Monat | Pro_Lag | Pro_Lead | +----+--------------------+-------+---------+---------+----------+ | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | NULL | 1600 | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 1600 | 1000 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 1600 | 1000 | | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 | 800 | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 1000 | 600 | | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 800 | NULL | | 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | NULL | 300 | | 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 700 | 200 | | 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 300 | 200 | | 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 200 | 100 | | 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 200 | 0 | | 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 100 | NULL | +----+--------------------+-------+---------+---------+----------+ 12 Zeilen im Satz (0,00 Sek.) Hier möchte ich die Studierenden fragen, ob ihnen aufgefallen ist, dass dieses SQL anders ist als das vorherige SQL? Was sind die Unterschiede? WÄHLEN *, lag(sales,1) über win als pro_lag, Lead(Sales,1) über Win als Pro_Lead von chh_baozipu, wobei Produkt = „Brötchen mit Schweinefleisch und Frühlingszwiebeln“ WINDOW gewinnt als (PARTITION NACH Produkt, ORDER NACH Verkaufsabstieg); 1. Tatsächlich öffnet diese Methode das Fenster und Hat jemand Programmierer gefragt, welche Einfachheit sie sich wünschen? Andere werden Ihren Code großartig finden, auch wenn sie ihn nicht verstehen. Es ist offensichtlich, dass diese Art von Schülern von der Gesellschaft nie geschlagen wurde. Wenn Sie auf den Ahnenkodex stoßen, der alle hundert Jahre einmal auftaucht, werden Sie verstehen, was Einfachheit ist (um das Bild von Fat Brother auszuleihen). 2. Dieses Schlüsselwort in der over-Klausel bedeutet, dass der Inhalt des Fensters gesteuert wird. In der grundlegenden Syntax oben habe ich Ihnen gesagt, dass over zwei Schlüsselwörter enthält:
Tatsächlich gibt es interessantere Möglichkeiten, den Fensterbereich zu steuern ~~ Es gibt zwei Möglichkeiten Die Syntax BETWEEN frame_start AND frame_end wird normalerweise verwendet, um einen Zeilenbereich anzugeben. frame_start und frame_end können die folgenden Schlüsselwörter unterstützen, um verschiedene dynamische Zeilendatensätze zu identifizieren:
Schauen wir uns einige Beispiele an: ① Berechnen Sie die aggregierte Fensterfunktion der aktuellen Zeile und der vorherigen n Zeilen (insgesamt n + 1 Zeilen). Im folgenden Beispiel ist die Kontrollfenstergröße die Summe der Gewinne des aktuellen Monats + der vorherigen beiden Monate. Schauen wir uns die Auswirkung an: SELECT *,SUM(sales) OVER win als „Summe der Gewinne der letzten drei Monate“ VON chh_baozipu WINDOW win as (PARTITION BY Produkt ORDER BY „Monat“ ZEILEN 2 VORHERGEHENDE); mysql> SELECT *,SUM(sales) OVER win als 'Summe der Gewinne der letzten drei Monate' -> VON chh_baozipu -> WINDOW win as (PARTITION BY Produkt ORDER BY „Monat“ ZEILEN 2 VORHERGEHENDE); +----+--------------------+-------+---------+--------------------------+ | ID | Produkt | Umsatz | Monat | Gesamtgewinn der letzten drei Monate | +----+--------------------+-------+---------+--------------------------+ | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 2600 | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 3400 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 3400 | | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 3400 | | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 3200 | | 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 200 | | 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 300 | | 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 300 | | 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 400 | | 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 500 | | 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 1200 | +----+--------------------+-------+---------+--------------------------+ 12 Zeilen im Satz (0,00 Sek.) ② Berechnen Sie die aggregierte Fensterfunktion der aktuellen Zeile, der ersten n1 Zeilen und der letzten n2 Zeilen Im folgenden Beispiel ist die Kontrollfenstergröße die Summe der Gewinne aus dem Monat vor und dem Monat nach dem aktuellen Monat. Schauen wir uns die Auswirkung an: SELECT *,SUM(sales) OVER win als „Summe der Gewinne der ersten drei Monate“ VON chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month` ROWS BETWEEN n1 PRECEDING AND n2 FOLLOWING); mysql> SELECT *,SUM(sales) OVER win as 'Summe der Gewinne vom vorherigen Monat bis zum nächsten Monat' FROM chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING); +----+--------------------+-------+---------+--------------------------+ | ID | Produkt | Umsatz | Monat | Summe der Gewinne vom Vormonat zum Folgemonat| +----+--------------------+-------+---------+--------------------------+ | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 2600 | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 3400 | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 3400 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 3400 | | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 3200 | | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 2200 | | 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 300 | | 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 300 | | 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 400 | | 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 500 | | 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 1200 | | 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 900 | +----+--------------------+-------+---------+--------------------------+ 12 Zeilen im Satz (0,00 Sek.) 4. Kopf- und Endfunktionen: FIRST_VALUE(expr), LAST_VALUE(expr)Die Kopf- und Schwanzfunktionen werden verwendet, um: den ersten oder letzten Wert von expr zurückzugeben; Anwendungsszenario: Abfrage WÄHLEN *, FIRST_VALUE(Umsatz) über Gewinn als „Aktuelles maximales Monatseinkommen“, LAST_VALUE(Umsatz) über Gewinn als „Aktuelles monatliches Mindesteinkommen“ von chh_baozipu WINDOW win as (PARTITION NACH Produkt ORDER BY „Monat“); mysql> SELECT *,FIRST_VALUE(Umsatz) über Win als „Aktuelles maximales Monatseinkommen“,LAST_VALUE(Umsatz) über Win als „Aktuelles minimales Monatseinkommen“ von chh_baozipu WINDOW Win als (PARTITION BY Produkt ORDER BY „Monat“); +----+--------------------+-------+---------+--------------------------+-------------------------+ | ID | Produkt | Umsatz | Monat | Aktuelles maximales Monatseinkommen | Aktuelles minimales Monatseinkommen | +----+--------------------+-------+---------+--------------------------+-------------------------+ | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 | 1000 | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 1000 | 1600 | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 1000 | 800 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 1000 | 1000 | | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 1000 | 1600 | | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 1000 | 600 | | 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 200 | 200 | | 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 200 | 100 | | 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 200 | 0 | | 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 200 | 300 | | 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 200 | 200 | | 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 200 | 700 | +----+--------------------+-------+---------+--------------------------+-------------------------+ 12 Zeilen im Satz (0,00 Sek.) 5. Andere Funktionen: nth_value() / nfile() nfile() wird nicht häufig verwendet, daher gehen wir hier nicht ins Detail; hier erwähnen wir nur NTH_VALUE Zweck: Gibt den Wert des n-ten Ausdrucks im Fenster zurück. Anwendungsszenario: Ab sofort werden die Gewinne des zweiten und dritten Platzes in der monatlichen Gewinnliste von Chen Haha Steamed Bun Shop angezeigt. WÄHLEN *, nth_value(sales,2) über win als 'derzeit zweithöchstes Monatseinkommen', nth_value(sales,3) über win als „Aktueller Dritter beim monatlichen Einkommen“ von chh_baozipu WINDOW win as (PARTITION NACH Produkt ORDER BY „Monat“); mysql> SELECT *, nth_value(sales,2) over win as 'Aktuell auf Platz 2 beim Monatseinkommen', nth_value(sales,3) over win as 'Aktuell auf Platz 3 beim Monatseinkommen' from chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month`); +----+--------------------+-------+---------+--------------------------------+--------------------------------+ | ID | Produkt | Umsatz | Monat | Aktuelles zweitrangiges Monatseinkommen | Aktuelles drittrangiges Monatseinkommen | +----+--------------------+-------+---------+--------------------------------+--------------------------------+ | 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | NULL | NULL | | 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 1600 | NULL | | 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 1600 | 800 | | 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 1600 | 800 | | 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 1600 | 800 | | 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 1600 | 800 | | 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | NULL | NULL | | 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 100 | NULL | | 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 100 | 0 | | 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 100 | 0 | | 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 100 | 0 | | 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 100 | 0 | +----+--------------------+-------+---------+--------------------------------+--------------------------------+ 12 Zeilen im Satz (0,00 Sek.) KapitelzusammenfassungDas ist alles, was ich zu Fensterfunktionen zu sagen habe. Fensterfunktionen sind etwas Neues, das ich entdeckt habe, nachdem ich mit MySQL 8 in Berührung gekommen bin. Plötzlich habe ich das Gefühl, dass das MySQL-Entwicklungsteam immer noch sehr kreativ ist. Jede Version fügt einige neue Spielmöglichkeiten hinzu, die natürlich sehr praktisch sind. Ich hoffe, dass MySQL 9.0 uns noch mehr Überraschungen bringen wird. Dies ist das Ende dieses Artikels über die spezifische Verwendung von MySQL-Fensterfunktionen. Weitere relevante Inhalte zu MySQL-Fensterfunktionen finden Sie in früheren Artikeln auf 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:
|
<<: Lösung für das Problem der großen Schriftgröße auf iPhone-Geräten in WAP-Seiten
>>: Vue + ElementUI implementiert Paging-Funktion - MySQL-Daten
JS berechnet den Gesamtpreis der Waren im Warenko...
Welche Vorteile bietet das Erlernen von HTML? 1: ...
Inhaltsverzeichnis 1. Prinzip des ganz linken Prä...
Website-Administratoren löschen Website-Daten aus...
Inhaltsverzeichnis 1. Einleitung: In diesem Fall ...
1. Konfigurieren Sie die lokale Yum-Quelle 1. Mou...
Die schlechteste Option besteht darin, die Ergebn...
Vorwort Standardmäßig werden Nginx-Protokolle in ...
Inhaltsverzeichnis Vorwort Der Wert der modularen...
Inhaltsverzeichnis 0. Was ist Webpack 1. Einsatz ...
Ich habe Vue.js verwendet, um ein Bildanzeigemodu...
Es gibt zwei Typen: (verschiedene Browser) 1. Verf...
Dieser Artikel veranschaulicht anhand von Beispie...
Zwei Implementierungen der Vue-Dropdown-Liste Die...
Oft möchten wir in Linux eine Datei finden, wisse...