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.

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.
