In SQL is de GROUP BY
clausule kan worden gebruikt om de resultaten van een zoekopdracht in groepen rijen te verdelen.
Dit wordt meestal gedaan om een of meer aggregaties op elke groep uit te voeren.
Voorbeeld 1
Hier is een voorbeeld om de GROUP BY
. te demonstreren clausule.
Neem de volgende tabel:
SELECT * FROM Products;
Resultaat:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | 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. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
We kunnen de volgende query uitvoeren op die tabel.
SELECT
VendorId,
COUNT(VendorId) AS Count
FROM Products
GROUP BY VendorId;
Resultaat:
+------------+---------+ | VendorId | Count | |------------+---------| | 1001 | 3 | | 1002 | 1 | | 1003 | 2 | | 1004 | 1 | +------------+---------+
Hier gebruiken we de COUNT()
aggregatiefunctie om het aantal rijen voor elke VendorId
te retourneren , dan de GROUP BY
clausule om de resultaten te groeperen.
Voorbeeld 2
In dit voorbeeld gebruiken we de SUM()
aggregatiefunctie om de totale bevolking van alle steden binnen een district te retourneren, en vervolgens de GROUP BY
clausule om de resultaten te groeperen.
Stel je voor dat we een tabel hebben met de naam City
die plaatsnamen en hun bevolking opslaat, evenals hun respectievelijke landcodes en districten (in hun eigen afzonderlijke kolommen).
Zoals dit:
SELECT * FROM city
WHERE CountryCode IN ('AGO', 'ARE', 'AUS');
Resultaat:
+------+---------------+---------------+-----------------+--------------+ | 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 | +------+---------------+---------------+-----------------+--------------+
Ik heb de resultaten teruggebracht tot slechts drie landen, anders zou de lijst way . zijn te lang voor dit artikel.
Stel nu dat we de bevolking van elk district willen hebben, en dat we elk district willen opsommen, samen met het aantal inwoners en de landcode.
We zouden dit kunnen doen.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
ORDER BY CountryCode;
Resultaat:
+---------------+-----------------+--------------+ | 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 | +---------------+-----------------+--------------+
We kunnen zien dat onze resultaten zijn gegroepeerd zoals gespecificeerd, en we krijgen nu de volledige bevolking voor elk district (in tegenstelling tot de bevolking van de individuele steden, zoals ze zijn opgeslagen in de onderliggende tabel).
Merk op dat de GROUP BY
clausule moet komen na een WHERE
clausule en vóór een ORDER BY
clausule.
Als we de bevolking van elk land wilden hebben in plaats van het district, wordt onze zoekopdracht nog compacter.
SELECT
CountryCode,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode
ORDER BY CountryCode;
Resultaat:
+---------------+--------------+ | CountryCode | Population | |---------------+--------------| | AGO | 2561600 | | ARE | 1728336 | | AUS | 11313666 | +---------------+--------------+
Houd er rekening mee dat deze specifieke voorbeelddatabase erg verouderd is en dat de populatieaantallen niet overeenkomen met de huidige realiteit.
Voorbeeld 3 – De HAVING-clausule
U kunt de HAVING
. opnemen clausule met uw GROUP BY
clausule om de groepen te filteren.
Voorbeeld:
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;
Resultaat:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
De HAVING
clausule is vergelijkbaar met de WHERE
clausule, behalve dat WHERE
filtert individuele rijen, terwijl HAVING
filtert groepen.
Ook de WHERE
clausule filtert gegevens voor het is gegroepeerd, terwijl HAVING
filtert gegevens na het is gegroepeerd.
De HAVING
clausule accepteert dezelfde operatoren die u kunt gebruiken met de WHERE
clausule (zoals =
, ) Operator for Beginners">>
, =) Operator for Beginners">>=
, IN
, LIKE
, enz.).