Zurück zur Artikelliste Artikel
7 Leseminuten

Wie man WHERE mit GROUP BY in SQL verwendet

In diesem Artikel besprechen wir, wie man die WHERE- und GROUP BY-Klauseln in SQL kombiniert Wenn Sie täglich SQL schreiben, werden Sie schnell feststellen, wie oft sowohl die WHERE- als auch die GROUP BY-Klausel verwendet werden. WHERE ist ein wesentlicher Bestandteil der meisten Abfragen. Sie ermöglicht es Ihnen, große Datensätze auf die Teile zu filtern, an denen Sie interessiert sind. GROUP BY ist eines der mächtigsten Werkzeuge, die einem Analysten bei der Aggregation von Daten zur Verfügung stehen. Am Ende dieses Artikels werden Sie verstehen, wie Sie diese beiden Klauseln effektiv einsetzen und gleichzeitig häufige Fallstricke vermeiden können.

Betrachten Sie beim Schreiben von SQL jede Klausel (SELECT, WHERE, GROUP BY, usw.) als ein separates Werkzeug. Wenn Sie mehr SQL-Syntax lernen, fügen Sie dieses Werkzeug zu Ihrem Werkzeugsatz hinzu. Sie können sich vorstellen, dass ein Mechaniker mit nur wenigen Werkzeugen nicht sehr effektiv sein kann. Ich würde Ihnen auch nicht empfehlen, Ihr Auto zu jemandem zu bringen, der nur eine Handvoll Werkzeuge hat. Genauso verhält es sich mit der Datenanalyse. Je mehr Werkzeuge Sie zur Verfügung haben, desto schneller und effizienter können Sie verschiedene Datensätze analysieren.

Eine der umfassendsten Möglichkeiten, sich SQL-Tools anzueignen, ist unser interaktiver Kurs SQL für Anfänger. Er enthält 129 Übungen und deckt sowohl grundlegende als auch fortgeschrittene SQL-Kenntnisse ab und vermittelt Ihnen alles, was Sie brauchen, um ein effektiver Datenanalyst zu werden.

Beginnen wir mit einem detaillierten Blick auf WHERE und GROUP BY. Nachdem wir uns dieses Grundwissen angeeignet haben, werden wir die beiden miteinander kombinieren und ihre volle Leistungsfähigkeit entfalten.

Die WHERE-Klausel

Wie bereits erwähnt, wird die WHERE-Klausel verwendet, um einen Datensatz zu filtern und nur die Datensätze zurückzugeben, die bestimmten Kriterien entsprechen. Nehmen wir den folgenden Datensatz, der die Bevölkerungszahlen der Länder für das Jahr 2022 enthält.

Zur Veranschaulichung nehmen wir an, dass diese Daten in einer Tabelle namens world_populations gespeichert sind und nur die 10 bevölkerungsreichsten Länder enthalten. Wir sehen uns diese Daten an, indem wir sie ausführen:

SELECT *
FROM world_populations

Hier ist das Ergebnis:

countrypopulationyearly_changenet_changemed_ageurban_pop_pctworld_share
China1,439,323,7760.00395,540,09038.61.1847
India1,380,004,3850.009913,586,63128.35.1770
United States331,002,6510.00591,937,73438.83.0425
Indonesia273,523,615.01072,898,04730.56.0351
Pakistan220,892,340.024,327,02223.35.0283
Brazil212,559,41700721,509,89033.88.0273
Nigeria206,139,589.02585,175,99018.52.0264
Bangladesh164,689,383.01011,643,22228.39.0211
Russia145,934,462.000462,20640.74.0187
Mexico128,932,753.01061,357,22429.84.0165

OK, wir haben unsere Daten. Fügen wir nun einige Filter hinzu.

Beispiel 1

In unserem ersten Beispiel wollen wir nur Länder mit einer Bevölkerung von mehr als 200 Millionen sehen. Dazu führen wir die folgende Abfrage aus:

SELECT *
FROM world_populations
WHERE population > 200000000

Und das Ergebnis:

countrypopulationyearly_changenet_changemed_ageurban_pop_pctworld_share
China14393237760.0039554009038.61.1847
India13800043850.00991358663128.35.1770
United States3310026510.0059193773438.83.0425
Indonesia273523615.0107289804730.56.0351
Pakistan220892340.02432702223.35.0283
Brazil2125594170.72%15098903388%2.73%
Nigeria2061395892.58%51759901852%2.64%

Wir sehen, dass die WHERE -Klausel Bangladesch, Russland und Mexiko herausgefiltert hat, weil ihre Bevölkerungszahlen unter dem in unserer Abfrage festgelegten Schwellenwert liegen.

Beispiel #2

Die WHERE Klausel kann auch mehrere Filter unterstützen. Wir wollen nur Länder auflisten, die eine positive jährliche Veränderung in der Anzahl der Migranten aufweisen und in denen mindestens 80 % der Bevölkerung in städtischen Gebieten leben. Beachten Sie, dass wir AND in der WHERE Klausel verwendet haben, um diese beiden Bedingungen miteinander zu verbinden:

SELECT *
FROM world_populations
WHERE migrants > 0
  AND urban_pop_pct > .80

Diese Abfrage gibt zurück:

countrypopulationyearly_changenet_changemed_ageurban_pop_pctworld_share
United States3310026510.0059193773438.83.0425
Brazil2125594170.0072150989033.88.0273

Es gibt keine Begrenzung für die Menge der Filterung, die Sie in einer WHERE Klausel durchführen können. Weitere Einzelheiten finden Sie in unserem Vollständigen Leitfaden zur SQL WHERE-Klausel

Die GROUP BY-Klausel

Um GROUP BY zu verstehen, verwenden wir einen anderen Datensatz namens transactions. Er enthält Transaktionsdaten für einen Online-Händler:

DescriptionProductCategoryQuantityUnitPriceCustomerID
KNITTED UNION FLAG HOT WATER BOTTLEKitchen63.3917850
POPPY'S PLAYHOUSE BEDROOMToys62.117850
IVORY KNITTED MUG COSYKitchen61.6513047
BOX OF VINTAGE JIGSAW BLOCKSToys34.9513047
RED COAT RACK PARIS FASHIONClothing34.9513047
YELLOW COAT RACK PARIS FASHIONClothing34.9513047
BLUE COAT RACK PARIS FASHIONClothing34.9513047

Beispiel #1

Der Operator GROUP BY wird verwendet, um Daten zu aggregieren, indem Datensätze gruppiert werden, die denselben Wert in einem bestimmten Feld haben. Um die Frage "Wie viele Artikel wurden in jeder Produktkategorie verkauft?" zu beantworten, würden wir die folgende Abfrage ausführen:

SELECT 
  productCategory,
  SUM(quantity) as quantity
FROM transactions 
GROUP BY productCategory

Hier sind die Ergebnisse:

ProductCategoryQuantity
Kitchen12
Toys9
Clothing9

Es gibt zwei Produkte in der Produktkategorie Küche: GESTRICHENE UNION FLAG HOT WATER BOTTLE und IVORY KNITTED MUG COSY. Jedes dieser Produkte hat eine Menge von 6, so dass die Gesamtsumme für die Produktkategorie Küche 12 beträgt.

In der Produktkategorie Spielzeug gibt es zwei Produkte. POPPY'S PLAYHOUSE BEDROOM hat eine Menge von 6 und BOX OF VINTAGE JIGSAW BLOCKS hat eine Menge von 3, was eine Gesamtsumme von 9 ergibt.

Schließlich gibt es noch drei Produkte in der Kategorie Kleidung, die jeweils eine Menge von 3 haben, so dass die Gesamtsumme der Kategorie Kleidung 9 beträgt.

Wir werden hier nicht alle aufzählen, aber es gibt viele Arten von Aggregationen, die dem Datenanalysten zur Verfügung stehen. Dazu gehören SUM(), AVG(), COUNT(), MEDIAN(), MIN(), und MAX(). Weitere Informationen finden Sie in dem Artikel Wie man Aggregatfunktionen in der WHERE-Klausel verwendet.

Beispiel #2

Was, wenn wir die Mengen für jede Produktkategorie und jeden Kunden aggregieren möchten? Wir können GROUP BY mehrere Spalten:

SELECT 
  customerId,
  productCategory,
  SUM(quantity) as quantity
FROM transactions 
GROUP BY customerId, productCategory

Und das ist das Ergebnis:

CustomerIDProductCategoryQuantity
17850Kitchen6
17850Toys6
13047Kitchen6
13047Toys3
13047Clothing9

Wir sehen, dass es für jede Kombination von Kunde und Produktkategorie eine Zeile gibt; jetzt wissen wir, wie viele Artikel jeder Kunde von jeder Kategorie gekauft hat.

Weitere Informationen über GROUP BY finden Sie unter Verwendung von GROUP BY in SQL und GROUP BY in SQL erklärt.

WHERE und GROUP BY zusammen verwenden

Nachdem wir nun die Grundlage geschaffen haben, können wir WHERE und GROUP BY miteinander kombinieren. Es ist wichtig, daran zu denken, dass die WHERE Klausel den Datensatz filtert , bevor die GROUP BY Klausel ausgewertet wird. Außerdem wird die WHERE Klausel immer vor GROUP BY stehen. Wenn Sie sie danach einfügen, wird die Abfrage einen Fehler zurückgeben.

Beispiel #1

Betrachten Sie denselben Datensatz und überlegen Sie, wie wir die Frage "Wie hoch ist der durchschnittliche Stückpreis von Küchenprodukten und Spielzeug?" beantworten würden.

Zunächst müssen wir nach Küchenartikeln und Spielzeug filtern. Anschließend berechnen wir den durchschnittlichen Stückpreis. Hier ist die Abfrage:

SELECT
  productCategory,
  AVG(UnitPrice) as AvgUnitPrice
FROM transactions 
WHERE productCategory in(‘Kitchen’, ‘Toys’)
GROUP BY productCategory

Und das Ergebnis ist:

ProductCategoryAvgUnitPrice
Kitchen2.52
Toys3.05

Der durchschnittliche Stückpreis wird nur für Küchen- und Spielzeugprodukte berechnet. Alle anderen Kategorien werden aus der Abfrage herausgefiltert.

Beispiel #2

Betrachten wir nun, wie wir die Gesamtmenge der Produkte nach Kategorie erhalten würden, bei denen der durchschnittliche Stückpreis größer als 3 ist. Dazu würden wir Folgendes ausführen:

SELECT
  productCategory,
  SUM(quantity) as quantity
FROM transactions 
WHERE unitPrice > 3
GROUP BY productCategory

In diesem Beispiel werden die Aggregate anhand der gefilterten Zeilen berechnet. Wir erhalten das folgende Ergebnis:

ProductCategoryQuantity
Kitchen6
Toys3
Clothing9

Da nur die Produkte GEWIRKTE UNIONFLASCHE, KASTEN MIT VINTAGE JIGSAW-BLÖCKCHEN, ROTES MÄDCHENRACK PARIS FASHION, GELBES MÄDCHENRACK PARIS FASHION und BLAUES MÄDCHENRACK PARIS FASHION einen Stückpreis von mehr als 3 haben, sind dies die einzigen Produkte, die in die Aggregation einbezogen werden.

Wenn wir die Klausel WHERE ausschließen würden, ergäben sich die folgenden Ergebnisse:

ProductCategoryQuantity
Kitchen12
Toys9
Clothing9

Hier sehen wir, dass die Mengen aller Produkte, unabhängig vom Stückpreis, summiert werden. Die Gesamtmenge ist für alle Produkte anders als für Produkte mit einem Stückpreis über 3.

Beispiel #3

Was ist, wenn wir nach einer aggregierten Spalte filtern wollen? Dies ist die Aufgabe der HAVING Klausel. Sie können keine Aggregation in die WHERE-Klausel einfügen. Die HAVING -Klausel wird anstelle von WHERE verwendet, wenn nach Aggregatfunktionen gefiltert wird. Wir können dies anhand eines weiteren Beispiels veranschaulichen. Fahren wir mit dem obigen Beispiel fort und filtern die Ergebnisse nach Produktkategorien, bei denen der durchschnittliche Stückpreis größer als 3 ist. Um dies zu erreichen, würden wir schreiben:

SELECT
  productCategory 
  AVG(UnitPrice) as AvgUnitPrice
FROM transactions 
WHERE productCategory in (‘Kitchen’, ‘Toys’)
GROUP BY productCategory
HAVING AVG(UnitPrice) > 3

Ergebnis:

ProductCategoryAvgUnitPrice
Toys3.05

Zunächst schränkt die Klausel WHERE die Daten nur auf die Kategorien Küche und Produkt ein. Dann aggregiert GROUP BY den durchschnittlichen Stückpreis für jede Kategorie. Schließlich filtert die Klausel HAVING die Ergebnisse weiter, um nur Produktkategorien mit einem durchschnittlichen Stückpreis von mehr als 3 einzuschließen.

Würde man die Klausel HAVING entfernen, wären sowohl die Kategorie Küche als auch die Kategorie Spielzeug im Ergebnis zu sehen. Da der durchschnittliche Stückpreis von Küchenartikeln jedoch unter 3 liegt, wird er herausgefiltert, wenn wir die Klausel HAVING hinzufügen.

Weitere Beispiele finden Sie in unserem Artikel über HAVING vs. WHERE in SQL: Was Sie wissen sollten.

WHERE und GROUP BY - Wie geht es jetzt weiter?

Gute Arbeit! Sie haben die grundlegenden Kenntnisse erworben, die Sie benötigen, um WHERE und GROUP BY Klauseln in SQL zu kombinieren. Sie haben den Unterschied zwischen WHERE und HAVING kennengelernt. Noch wichtiger ist, dass Sie alle drei Klauseln miteinander kombinieren können, um Daten nach Ihren Bedürfnissen zu filtern und zu aggregieren.

Sie haben zwei weitere Tools zu Ihrem Toolkit hinzugefügt und sind bereit, sie zu verwenden. Eine gute Möglichkeit, das Gelernte zu vertiefen, ist unser interaktiver Kurs SQL für Anfänger. Übung macht den Meister!

Schauen Sie sich auch alle unsere anderen großartigen Artikel an.