In SQL das GROUP BY
-Klausel kann verwendet werden, um die Ergebnisse einer Abfrage in Zeilengruppen aufzuteilen.
Dies geschieht normalerweise, um eine oder mehrere Aggregationen für jede Gruppe durchzuführen.
Beispiel 1
Hier ist ein Beispiel zur Veranschaulichung von GROUP BY
Klausel.
Nehmen Sie die folgende Tabelle:
SELECT * FROM Products;
Ergebnis:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | 55.99 | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Wir könnten die folgende Abfrage für diese Tabelle ausführen.
SELECT
VendorId,
COUNT(VendorId) AS Count
FROM Products
GROUP BY VendorId;
Ergebnis:
+------------+---------+ | VendorId | Count | |------------+---------| | 1001 | 3 | | 1002 | 1 | | 1003 | 2 | | 1004 | 1 | +------------+---------+
Hier verwenden wir den COUNT()
Aggregatfunktion, um die Anzahl der Zeilen für jede VendorId
zurückzugeben , dann GROUP BY
-Klausel zum Gruppieren der Ergebnisse.
Beispiel 2
In diesem Beispiel verwenden wir den SUM()
Aggregatfunktion, um die Gesamtbevölkerung aller Städte innerhalb eines Bezirks zurückzugeben, dann GROUP BY
-Klausel zum Gruppieren der Ergebnisse.
Stellen Sie sich vor, wir haben eine Tabelle namens City
die Städtenamen und ihre Bevölkerung sowie ihre jeweiligen Ländercodes und Bezirke (in eigenen separaten Spalten) speichert.
So:
SELECT * FROM city
WHERE CountryCode IN ('AGO', 'ARE', 'AUS');
Ergebnis:
+------+---------------+---------------+-----------------+--------------+ | ID | Name | CountryCode | District | Population | |------+---------------+---------------+-----------------+--------------| | 56 | Luanda | AGO | Luanda | 2022000 | | 57 | Huambo | AGO | Huambo | 163100 | | 58 | Lobito | AGO | Benguela | 130000 | | 59 | Benguela | AGO | Benguela | 128300 | | 60 | Namibe | AGO | Namibe | 118200 | | 64 | Dubai | ARE | Dubai | 669181 | | 65 | Abu Dhabi | ARE | Abu Dhabi | 398695 | | 66 | Sharja | ARE | Sharja | 320095 | | 67 | al-Ayn | ARE | Abu Dhabi | 225970 | | 68 | Ajman | ARE | Ajman | 114395 | | 130 | Sydney | AUS | New South Wales | 3276207 | | 131 | Melbourne | AUS | Victoria | 2865329 | | 132 | Brisbane | AUS | Queensland | 1291117 | | 133 | Perth | AUS | West Australia | 1096829 | | 134 | Adelaide | AUS | South Australia | 978100 | | 135 | Canberra | AUS | Capital Region | 322723 | | 136 | Gold Coast | AUS | Queensland | 311932 | | 137 | Newcastle | AUS | New South Wales | 270324 | | 138 | Central Coast | AUS | New South Wales | 227657 | | 139 | Wollongong | AUS | New South Wales | 219761 | | 140 | Hobart | AUS | Tasmania | 126118 | | 141 | Geelong | AUS | Victoria | 125382 | | 142 | Townsville | AUS | Queensland | 109914 | | 143 | Cairns | AUS | Queensland | 92273 | +------+---------------+---------------+-----------------+--------------+
Ich habe die Ergebnisse auf nur drei Länder reduziert, sonst wäre die Liste weg zu lang für diesen Artikel.
Nehmen wir nun an, wir wollten die Bevölkerung jedes Bezirks abrufen und jeden Bezirk zusammen mit seiner Bevölkerung und seinem Ländercode auflisten.
Wir könnten das tun.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
ORDER BY CountryCode;
Ergebnis:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Benguela | 258300 | | AGO | Huambo | 163100 | | AGO | Luanda | 2022000 | | AGO | Namibe | 118200 | | ARE | Abu Dhabi | 624665 | | ARE | Ajman | 114395 | | ARE | Dubai | 669181 | | ARE | Sharja | 320095 | | AUS | Capital Region | 322723 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | South Australia | 978100 | | AUS | Tasmania | 126118 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Wir können sehen, dass unsere Ergebnisse wie angegeben gruppiert sind, und wir erhalten jetzt die vollständige Bevölkerung für jeden Bezirk (im Gegensatz zur Bevölkerung der einzelnen Städte, wie sie in der zugrunde liegenden Tabelle gespeichert sind).
Beachten Sie, dass GROUP BY
-Klausel muss nach jedem WHERE
kommen -Klausel und vor jedem ORDER BY
Klausel.
Wenn wir anstelle des Bezirks die Bevölkerung jedes Landes erhalten möchten, wird unsere Abfrage noch kompakter.
SELECT
CountryCode,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode
ORDER BY CountryCode;
Ergebnis:
+---------------+--------------+ | CountryCode | Population | |---------------+--------------| | AGO | 2561600 | | ARE | 1728336 | | AUS | 11313666 | +---------------+--------------+
Denken Sie daran, dass diese spezielle Beispieldatenbank sehr veraltet ist und ihre Bevölkerungszahlen nicht die aktuelle Realität widerspiegeln.
Beispiel 3 – Die HAVING-Klausel
Sie können den HAVING
einfügen -Klausel mit Ihrem GROUP BY
-Klausel zum Filtern der Gruppen.
Beispiel:
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode;
Ergebnis:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Das HAVING
-Klausel ähnelt der WHERE
-Klausel, außer dass WHERE
filtert einzelne Zeilen, während HAVING
filtert Gruppen.
Auch das WHERE
-Klausel filtert Daten vorher es ist gruppiert, wohingegen HAVING
filtert Daten nach es ist gruppiert.
Das HAVING
-Klausel akzeptiert dieselben Operatoren, die Sie mit WHERE
verwenden können -Klausel (wie =
, ) Operator for Beginners">>
, =) Operator for Beginners">>=
, IN
, LIKE
usw.).