MySQL Aggregatfunktionen: SUMME, ANZAHL, AVG & MAX

⚡ Intelligente Zusammenfassung

Aggregatfunktionen in MySQL Führt eine Berechnung über mehrere Zeilen einer einzelnen Spalte durch und gibt einen zusammengefassten Wert zurück. Die fünf ISO-Standardfunktionen – COUNT, SUM, AVG, MIN und MAX – sie bilden die Grundlage für nahezu jeden Bericht, den eine Datenbank erstellt.

  • 🔢 ZÄHLVERHALTEN: COUNT(Spalte) ignoriert NULL-Werte, während COUNT(*) jede Zeile in der Tabelle zählt, einschließlich Duplikaten und NULL-Werten.
  • 🚫 DISTINCT-Schlüsselwort: DISTINCT entfernt doppelte Werte vor der Berechnung; ALL ist die Standardeinstellung und behält sie bei.
  • 📉 MIN und MAX: MIN gibt den kleinsten Wert in einer Spalte zurück und MAX den größten, und zwar gleichermaßen bei numerischen, Zeichenketten- und Datumswerten.
  • SUMME und AVG: Beide Funktionen arbeiten ausschließlich mit numerischen Spalten und schließen NULL-Zeilen vom zurückgegebenen Ergebnis aus.
  • 📊 GRUPPE NACH Paarung: Durch Hinzufügen von GROUP BY wird aus einer einzelnen Summenabbildung eine Summenzeile pro Gruppe.
  • ⚠️ NULL-Falle: AVG Es wird nur durch die Anzahl der nicht-NULL-Zeilen geteilt, sodass fehlende Werte den Durchschnitt stillschweigend erhöhen.

Was sind Aggregatfunktionen in MySQL?

An Aggregatfunktion Liest mehrere Zeilen einer einzelnen Spalte und fasst sie zu einem Wert zusammen. Aggregatfunktionen dienen im Wesentlichen folgenden Zwecken:

  • Berechnungen über mehrere Zeilen hinweg durchführen
  • Einer einzelnen Spalte einer Tabelle
  • Und einen einzelnen Wert zurückgeben.

Die ISO-Norm definiert fünf (5) Aggregatfunktionen, nämlich:

  1. ANZAHL
  2. SUM
  3. AVG
  4. MIN
  5. MAX

Eine Regel gilt für alle fünf: Aggregatfunktionen ignorieren NULL-WerteCOUNT(*) ist die einzige Ausnahme, und wir werden im Folgenden sehen, warum.

Warum Aggregatfunktionen verwenden?

Die Informationsbedürfnisse variieren je nach Organisationsebene. Führungskräfte der obersten Ebene interessieren sich in der Regel für Gesamtzahlen, nicht für individuelle Details.

Mithilfe von Aggregatfunktionen können wir einfach zusammengefasste Daten aus unserer Datenbank erstellen.

Beispielsweise kann das Management aus unserer Myflix-Datenbank die folgenden Berichte anfordern:

  • Am wenigsten ausgeliehene Filme.
  • Die meisten ausgeliehenen Filme.
  • Durchschnittliche Anzahl der Ausleihen jedes Films pro Monat.

Alle oben genannten Berichte stammen aus Aggregatfunktionen. Schauen wir uns jeden einzelnen genauer an.

COUNT-Funktion

Die Funktion COUNT gibt die Gesamtzahl der Werte im angegebenen Feld zurück, sowohl bei numerischen als auch bei nicht-numerischen Datentypen. Wie jede Aggregatfunktion schließt auch COUNT(Spalte) NULL-Werte aus.

COUNT(*) ist eine spezielle Funktion, die die Anzahl aller Zeilen in einer Tabelle zurückgibt. Sie zählt auch NULL-Werte und Duplikate, da es Zeilen statt Werte zählt.

Die Tabelle „movierentals“ enthält folgende Daten:

Referenznummer Transaktionsdatum Rückflugdatum Mitgliedsnummer movie_id movie_ zurückgegeben
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

Nehmen wir an, wir möchten die Anzahl der Ausleihen des Films mit der ID 2 ermitteln.

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Dies wird ausgeführt in MySQL Werkbank against myflixdb gibt 3 zurück, da drei Zeilen die movie_id 2 enthalten.

COUNT(`movie_id`)
3

DISTINCT-Schlüsselwort

COUNT beantwortet die Frage „Wie viele?“. Die nächste Frage lautet üblicherweise „Wie viele?“. anders „ones“, und genau dafür ist DISTINCT da.

DISTINCT-Schlüsselwort

Das Schlüsselwort DISTINCT entfernt Duplikate aus unseren Ergebnissen nach Gruppierung.ping identische Werte zusammen, genau wie die obige Abbildung zeigt.

Führen wir zunächst eine einfache Abfrage aus.

SELECT `movie_id` FROM `movierentals`;
movie_id
1
2
2
2
3

Nun die gleiche Abfrage mit dem Schlüsselwort DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT lässt die doppelten Datensätze aus:

movie_id
1
2
3

COUNT vs COUNT(*) vs COUNT(DISTINCT): Welche Funktion sollten Sie verwenden?

DISTINCT kann auch platziert werden innerhalb eine Aggregatfunktion, und genau hier verlieren die meisten Anfänger. track dieser Zeilen werden tatsächlich gezählt. Die vier untenstehenden Formulare verwenden alle dieselbe fünfzeilige Tabelle „movierentals“, die bereits gezeigt wurde, liefern aber nicht alle dasselbe Ergebnis. Der Unterschied lässt sich auf zwei Fragen zurückführen: Zählt das Formular Zeilen oder Werte, und werden Duplikate beibehalten?

Form Worauf es ankommt Ergebnis auf movierentals
COUNT (*) Jede Zeile, einschließlich Duplikaten und Zeilen, die vollständig NULL sind. 5
COUNT(`movie_id`) Alle nicht-NULL-Werte in der Spalte, einschließlich Duplikate. 5
COUNT(`return_date`) Nur Nicht-NULL-Werte – die beiden NULL-Rückgabewerte werden übersprungen. 3
COUNT(DISTINCT `movie_id`) Nur eindeutige Nicht-NULL-Werte 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Tipp: Verwenden Sie COUNT(*) für die Zeilenanzahl, COUNT(Spalte), wenn NULL „trifft nicht zu“ bedeuten soll, und COUNT(DISTINCT Spalte) für eindeutige Werte. Das Gegenteil von DISTINCT ist ALL – die Standardeinstellung, die daher selten explizit angegeben wird.

MIN-Funktion

Die MIN-Funktion gibt den kleinsten Wert im angegebenen Tabellenfeld zurück.

Angenommen, wir möchten das Jahr wissen, in dem der älteste Film in unserer Bibliothek veröffentlicht wurde. MySQLDie MIN-Funktion liefert uns das.

SELECT MIN(`year_released`) FROM `movies`;

Ergebnis:

MIN(`year_released`)
2005

MAX-Funktion

Wie der Name schon sagt, ist die MAX-Funktion das Gegenteil der MIN-Funktion. Es gibt den größten Wert aus dem angegebenen Tabellenfeld zurück.

Angenommen, wir möchten das Jahr ermitteln, in dem der neueste Film in unserer Datenbank erschienen ist. Das folgende Beispiel liefert dieses Ergebnis.

SELECT MAX(`year_released`) FROM `movies`;

Ergebnis:

MAX(`year_released`)
2012

SUMME-Funktion

MIN und MAX wählen einen vorhandenen Wert aus einer Spalte aus. SUMME und AVG Berechne eine neue Zahl aus der gesamten Spalte.

Angenommen, wir möchten die Gesamtsumme der bisher geleisteten Zahlungen ermitteln. MySQL SUM Funktion Gibt die Summe aller Werte in der angegebenen Spalte zurück.. SUM funktioniert nur bei numerischen Feldern und NULL-Werte werden vom Ergebnis ausgeschlossen.

Die folgende Tabelle zeigt die Daten in der Zahlungstabelle.

Zahlungs_ID Mitgliedsnummer Zahlungsdatum Beschreibung Betrag_ gezahlt externe_Referenznummer
1 1 23-07-2012 Zahlung für Filmverleih 2500 11
2 1 25-07-2012 Zahlung für Filmverleih 2000 12
3 3 30-07-2012 Zahlung für Filmverleih 6000 NULL

Die unten gezeigte Abfrage ruft alle getätigten Zahlungen ab und summiert sie zu einem einzigen Ergebnis: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Ergebnis:

SUMME(`amount_paid`)
10500

AVG Funktion

Das MySQL AVG Funktion gibt den Durchschnitt der Werte in einer angegebenen Spalte zurück. Genau wie die SUM-Funktion Funktioniert nur bei numerischen Datentypen.

Angenommen, wir möchten den durchschnittlich gezahlten Betrag ermitteln. Wir können die folgende Abfrage verwenden, die die Summe von 10500 durch die drei nicht-NULL-Zahlungszeilen teilt.

SELECT AVG(`amount_paid`) FROM `payments`;

Ergebnis:

AVG(`amount_paid`)
3500

⚠️ Warnung: AVG Die Division erfolgt durch die Anzahl der Zeilen ohne NULL-Werte, nicht durch die Zeilenanzahl der Tabelle. Ein NULL-Wert wird übersprungen, anstatt als Null gezählt zu werden, was den Durchschnitt unbewusst erhöht. AVG(IFNULL(`amount_paid`, 0)) wenn ein fehlender Wert Null bedeutet.

Praktisches Beispiel: Kombinieren von Aggregatfunktionen mit GROUP BY

Jede der obigen Funktionen lieferte einen Wert für die gesamte Tabelle. Hinzufügen eines GRUPPIERE NACH Die Klausel gibt eine Zahl zurück pro Gruppe stattdessen – und so entstehen echte Berichte.

Im folgenden Beispiel werden die Mitglieder nach Namen gruppiert und anschließend die Gesamtzahl der Zahlungen, der durchschnittliche Zahlungsbetrag und die Gesamtsumme der Zahlungsbeträge für jedes Mitglied ermittelt.

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

Ausführen des obigen Beispiels in MySQL Workbench liefert uns folgende Ergebnisse.

AVG Funktion, die mit GROUP BY verwendet wird

Die Abfrage verknüpft die beiden Tabellen in der WHERE-Klausel – der älteren Komma-Verknüpfung. Moderner Code formuliert dieselbe Logik als explizite Verknüpfung. INNER JOIN … ONBeachten Sie außerdem, dass jede nicht aggregierte Spalte in der SELECT-Liste in GROUP BY enthalten sein muss. MySQL 5.7 und spätere Versionen lehnen die Abfrage unter ONLY_FULL_GROUP_BY ab. Siehe die offiziell MySQL Referenz auf die Aggregatfunktion.

Häufig gestellte Fragen

Das WHERE-Klausel HAVING filtert einzelne Zeilen, bevor die Aggregation berechnet wird. HAVING filtert die gruppierten Ergebnisse anschließend, daher kann nur HAVING auf eine Aggregation wie COUNT(*) oder SUM(amount_paid) verweisen.

Ja. Ohne GROUP BY behandelt die Aggregatfunktion das gesamte Ergebnis als eine Gruppe und gibt genau eine Zeile zurück. Durch Hinzufügen von GROUP BY wird das Ergebnis in eine Zeile für jeden eindeutigen Gruppenwert aufgeteilt.

Ja. Im Gegensatz zu SUM und AVGMIN und MAX funktionieren mit jedem vergleichbaren Datentyp. In einer Textspalte geben sie den alphabetisch ersten und letzten Wert zurück, in einer Datumsspalte das früheste und späteste Datum.

Ja. Text-zu-SQL-Assistenten übersetzen Fragen wie „durchschnittliche Zahlung pro Mitglied“ in eine GROUP BY-Abfrage. Führen Sie das generierte SQL aus in MySQL Werkbank und überprüfen Sie die Zeilenanzahl, bevor Sie den Zahlen vertrauen.

Die häufigste Ursache sind Fehler im Umgang mit NULL-Werten und doppelten Join-Zeilen. Ein KI-Modell verwendet möglicherweise COUNT(*), wo COUNT(Spalte) benötigt wird, oder führt einen doppelten Join einer Tabelle durch, was zu einer unnötigen Erhöhung der Summenwerte führt. Überprüfen Sie die Ergebnisse daher immer anhand bekannter Werte.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: