MySQL GROUP BY- und HAVING-Klausel mit Beispielen

โšก Intelligente Zusammenfassung

Die SQL-Klauseln GROUP BY und HAVING wandeln detaillierte Zeilen in zusammenfassende Berichte um. GROUP BY fasst Zeilen mit gleichen Werten zu einer Zeile pro Gruppe zusammen, wรคhrend HAVING diese Gruppen filtert, nachdem Aggregatfunktionen wie COUNT angewendet wurden.

  • ๐Ÿ“Š Hauptzweck: GROUP BY gruppiert Zeilen mit identischen Werten und gibt fรผr jedes gruppierte Element eine einzelne Zeile zurรผck.
  • ๐Ÿงฉ Einzelsรคulengruppeping: Grouping Die Tabelle der Mitglieder nach Geschlecht fasst neun Zeilen zu zwei zusammen, eine fรผr Frauen und eine fรผr Mรคnner.
  • ๐Ÿ”— Mehrere Sรคulengruppenping: Grouping Bei zwei Spalten wird eine Zeile als eindeutig behandelt, wenn sich einer der beiden Werte unterscheidet, sodass nur exakte Duplikate zusammengefรผhrt werden.
  • ๐Ÿงฎ Aggregierte Paarung: ANZAHL, SUMME, AVG, MIN und MAX berechnen jeweils einen Wert pro Gruppe, woraus der zusammenfassende Bericht entsteht.
  • ๐Ÿšฆ HABEN versus WO: WHERE filtert Zeilen vor der GruppepingHAVING filtert die Gruppen anschlieรŸend, und nur HAVING akzeptiert aggregierte Ergebnisse.
  • โš ๏ธ Vorsicht im strikten Modus: Bei ONLY_FULL_GROUP_BY muss jede ausgewรคhlte Spalte gruppiert oder in eine Aggregatfunktion eingeschlossen werden.

SQL GROUP BY- und HAVING-Klausel

Was ist die SQL GROUP BY-Klausel?

Die GROUP BY-Klausel ist ein SQL-Befehl, der verwendet wird Gruppieren Sie Zeilen mit denselben WertenSie wird innerhalb der SELECT-Anweisung geschrieben und normalerweise zusammen mit Aggregatfunktionen verwendet, um zusammenfassende Berichte aus der Datenbank zu erstellen.

Genau das tut es: es fasst Daten zusammen Die Daten werden in der Datenbank gespeichert. Abfragen, die die GROUP BY-Klausel enthalten, werden als gruppierte Abfragen bezeichnet und geben fรผr jedes gruppierte Element eine einzelne Zeile zurรผck.

SQL GROUP BY-Syntax

Nachdem der Zweck der Klausel nun klar ist, schauen wir uns die Syntax einer einfachen gruppierten Abfrage an.

SELECT statements... GROUP BY column_name1[, column_name2, ...] [HAVING condition];

HIER KLICKEN

  • "SELECT-Anweisungenโ€ฆ" ist der Standard SQL-AUSWAHL Befehlsabfrage.
  • "GRUPPIERE NACH Spaltenname1" ist die Klausel, die die Gruppenfunktion ausfรผhrtping basierend auf column_name1.
  • "[, Spaltenname2, โ€ฆ]โ€œ ist optional und steht fรผr andere Spaltennamen, wenn die Gruppeping wird in mehr als einer Spalte durchgefรผhrt.
  • "[HAVING condition]Der Parameter "" ist optional und dient dazu, die von der GROUP BY-Klausel betroffenen Zeilen einzuschrรคnken. Er ist รคhnlich wie der Parameter "" WHERE-KlauselauรŸer dass es nach der Gruppenbildung angewendet wird.ping.

Grouping Verwendung einer einzelnen Spalte

Die schnellste Mรถglichkeit, die Wirkung der SQL-GROUP-BY-Klausel zu sehen, besteht darin, eine ungruppierte Abfrage mit einer gruppierten zu vergleichen. Beginnen Sie mit einer einfachen Abfrage, die alle Geschlechtsangaben in der Tabelle โ€žmembersโ€œ zurรผckgibt.

SELECT `gender` FROM `members`;
Geschlecht
Weiblich
Weiblich
Mรคnnlich
Weiblich
Mรคnnlich
Mรคnnlich
Mรคnnlich
Mรคnnlich
Mรคnnlich

Es werden neun Zeilen zurรผckgegeben, wobei jeder Wert wiederholt vorkommt. Angenommen, wir mรถchten stattdessen die eindeutigen Werte fรผr das Geschlecht erhalten. Die folgende Abfrage fรผgt die GROUP BY-Klausel hinzu.

SELECT `gender` FROM `members` GROUP BY `gender`;

Ausfรผhren des obigen Skripts in MySQL Werkbank gegen myflixdb gibt uns die folgenden Ergebnisse.

Geschlecht
Weiblich
Mรคnnlich

Beachten Sie, dass nur zwei Zeilen zurรผckgegeben wurden, da die Tabelle nur zwei Geschlechtstypen enthรคlt. Die GROUP BY-Klausel hat alle mรคnnlichen Mitglieder zusammengefasst und fรผr sie jeweils eine einzelne Zeile zurรผckgegeben; dasselbe gilt fรผr die weiblichen Mitglieder.

Grouping Verwendung mehrerer Spalten

Grouping Die Verwendung einer einzelnen Spalte ist fรผr einen aussagekrรคftigen Bericht oft zu grob. GROUP BY akzeptiert eine durch Kommas getrennte Liste von Spalten, und die Kombination ihrer Werte definiert die einzelnen Gruppen.

Angenommen, wir mรถchten eine Liste mit den `category_id`-Werten der Filme und den entsprechenden Erscheinungsjahren erhalten. Betrachten wir zunรคchst die Ausgabe dieser einfachen Abfrage.

SELECT `category_id`, `year_released` FROM `movies`;
Kategorie ID Jahr_verรถffentlicht
1 2011
2 2008
NULL 2008
NULL 2010
8 2007
6 2007
6 2007
8 2005
NULL 2012
7 1920
8 NULL
8 1920

Die hervorgehobenen Zeilen zeigen, dass das Ergebnis Duplikate enthรคlt. Durch Ausfรผhren derselben Abfrage mit GROUP BY werden diese entfernt.

SELECT `category_id`, `year_released` FROM `movies` GROUP BY `category_id`, `year_released`;

Ausfรผhren des obigen Skripts in MySQL Die Workbench-Analyse von myflixdb liefert die unten aufgefรผhrten Ergebnisse.

Kategorie ID Jahr_verรถffentlicht
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

Die GROUP BY-Klausel wird sowohl auf category_id als auch auf year_released angewendet, um folgende Merkmale zu identifizieren: Unvergesslich Zeilen. Die beiden doppelten Zeilen fรผr Kategorie 6 im Jahr 2007 wurden zu einer einzigen Zeile zusammengefasst.

Faustregel: Wenn die Kategorie-ID รผbereinstimmt, das Erscheinungsjahr jedoch unterschiedlich ist, wird die Zeile als eindeutig behandelt. Stimmen Kategorie-ID und Erscheinungsjahr in mehreren Zeilen รผberein, handelt es sich um Duplikate, von denen nur eine angezeigt wird.

Grouping und Aggregatfunktionen

Das Entfernen von Duplikaten ist nรผtzlich, aber die wahre Stรคrke von Gruppenfunktionen liegt in deren Optimierung.ping erscheint, wenn es mit AggregatfunktionenEine Aggregatfunktion berechnet fรผr jede Gruppe einen Wert: COUNT zรคhlt Zeilen, SUM addiert Werte und AVG, MIN und MAX beschreiben die Streuung.

Angenommen, wir mรถchten die Gesamtzahl der mรคnnlichen und weiblichen Mitglieder in der Datenbank ermitteln. Das folgende Skript erledigt das.

SELECT `gender`, COUNT(`membership_number`) FROM `members` GROUP BY `gender`;

Ausfรผhren des obigen Skripts in MySQL Die Workbench-Analyse von myflixdb liefert folgende Ergebnisse.

Geschlecht ANZAHL(`membership_number`)
Weiblich 3
Mรคnnlich 6

Die Zeilen werden nach jedem eindeutigen Geschlechtswert gruppiert, und die Anzahl der Zeilen innerhalb jeder Gruppe wird mit der Aggregatfunktion COUNT gezรคhlt. Die neun Datensรคtze werden zu zwei zusammenfassenden Zeilen zusammengefasst.

Einschrรคnkung von Abfrageergebnissen mithilfe der HAVING-Klausel

GroupingHAVING-Klauseln sind nicht immer fรผr jede Zeile einer Tabelle erforderlich. Manchmal muss der Bericht auf ein bestimmtes Kriterium beschrรคnkt werden, und genau dafรผr ist die HAVING-Klausel da.

Angenommen, wir mรถchten alle Erscheinungsjahre fรผr die Filmkategorie-ID 8 ermitteln. Das folgende Skript erzielt dieses Ergebnis.

SELECT * FROM `movies` GROUP BY `category_id`, `year_released` HAVING `category_id` = 8;

Ausfรผhren des obigen Skripts in MySQL Die Workbench-Analyse von myflixdb liefert die unten aufgefรผhrten Ergebnisse.

movie_id Titel Regisseur Jahr_verรถffentlicht Kategorie ID
9 Honey moonERS Johann Schulz 2005 8
5 Papas kleine Mรคdchen NULL 2007 8

Nur die Filme mit der Kategorie-ID 8 wurden von der HAVING-Bedingung beibehalten.

Warnung: MySQL Version 5.7 und hรถher aktivieren standardmรครŸig den Modus ONLY_FULL_GROUP_BY. In diesem Modus wird die Abfrage SELECT * mit einer GROUP BY-Klausel abgelehnt, da movie_id, title und director weder gruppiert noch aggregiert sind. Im Produktivbetrieb sollten die gruppierten Spalten explizit benannt werden, zum Beispiel: SELECT category_id, year_released FROM movies GROUP BY category_id, year_released HAVING category_id = 8;

WHERE vs HAVING vs GROUP BY vs ORDER BY

Anfรคnger verwechseln diese vier Klauseln hรคufig, da sie alle das Ergebnis beeinflussen. Der Unterschied liegt darin, dass wann MySQL wendet sie an: WHERE wird vor der Gruppierung der Zeilen ausgefรผhrt, HAVING danach und ORDER BY zuletzt.

Klausel Was sie tut, Wenn es lรคuft Akzeptiert Aggregatfunktionen
WO Filtert einzelne Zeilen vor jeder Gruppierung.ping. Vor GROUP BY Nein
GRUPPIERE NACH Fasst Zeilen mit gleichen Werten zu einer Zeile pro Gruppe zusammen. Nach WO Unzutreffend
HABEN Filtert die von GROUP BY erzeugten Gruppen. Nach GROUP BY Ja, zum Beispiel HAVING COUNT(*) > 2
SORTIEREN NACH Sortiert die Zeilen, die die vorherigen Klauseln รผberstehen. leicht Ja, ein Aggregatalias kann sortiert werden.

Die praktische Konsequenz betrifft die Performance. Das Filtern mit WHERE entfernt Zeilen vor der Gruppe.ping Da die Arbeit beginnt, gehรถrt eine Bedingung, die nicht von einem Gesamtergebnis abhรคngt, in die WHERE-Klausel und nicht in die HAVING-Klausel.

Hรคufig gestellte Fragen

Ja. GROUP BY allein gibt eine Zeile pro eindeutigem Wert zurรผck und entfernt Duplikate รคhnlich wie SELECT DISTINCT. Aggregatfunktionen sind nur dann erforderlich, wenn fรผr jede Gruppe ein berechneter Wert benรถtigt wird.

Der Fehler tritt auf, wenn eine ausgewรคhlte Spalte weder in GROUP BY aufgefรผhrt noch in eine Aggregatfunktion eingeschlossen ist. MySQL Es kann nicht entschieden werden, welcher Wert dieser Spalte fรผr die Gruppe angezeigt werden soll, daher wird die Abfrage abgelehnt.

COUNT(*) zรคhlt alle Zeilen in der Gruppe. COUNT(Spalte) zรคhlt nur die Zeilen, in denen die Spalte nicht vorhanden ist. NULLDie beiden Werte unterscheiden sich also immer dann, wenn die Spalte fehlende Werte enthรคlt.

Ja. KI-Assistenten in Tools wie z. B. MySQL Werkbank Eine Anfrage wie โ€žMitglieder pro Geschlechtโ€œ in eine gruppierte Abfrage umwandeln. Die Gruppe รผberprรผfenping Spalten selbst, weil eine falsche Gruppeping liefert Summen, die plausibel erscheinen, aber falsch sind.

Oft ja. KI-Abfrageassistenten erkennen klassische Ursachen wie zum Beispiel โ€ฆ JOIN das multipliziert Zeilen vor der Gruppepingoder ein Filter, der in HAVING anstatt in WHERE platziert wird. Die endgรผltige Entscheidung obliegt weiterhin der Person, die die Daten kennt.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: