I SQL er GROUP BY
klausul kan bruges til at opdele resultaterne af en forespørgsel i grupper af rækker.
Dette gøres normalt for at udføre en eller flere sammenlægninger på hver gruppe.
Eksempel 1
Her er et eksempel for at demonstrere GROUP BY
klausul.
Tag følgende tabel:
SELECT * FROM Products;
Resultat:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | 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. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Vi kunne køre følgende forespørgsel mod den tabel.
SELECT
VendorId,
COUNT(VendorId) AS Count
FROM Products
GROUP BY VendorId;
Resultat:
+------------+---------+ | VendorId | Count | |------------+---------| | 1001 | 3 | | 1002 | 1 | | 1003 | 2 | | 1004 | 1 | +------------+---------+
Her bruger vi COUNT()
aggregatfunktion til at returnere antallet af rækker for hver VendorId
, derefter GROUP BY
klausul for at gruppere resultaterne.
Eksempel 2
I dette eksempel bruger vi SUM()
aggregeringsfunktion til at returnere den aggregerede befolkning for alle byerne i et distrikt, derefter GROUP BY
klausul for at gruppere resultaterne.
Forestil dig, at vi har en tabel kaldet City
der gemmer bynavne og deres befolkning samt deres respektive landekoder og distrikter (i deres egne separate kolonner).
Sådan:
SELECT * FROM city
WHERE CountryCode IN ('AGO', 'ARE', 'AUS');
Resultat:
+------+---------------+---------------+-----------------+--------------+ | 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 | +------+---------------+---------------+-----------------+--------------+
Jeg reducerede resultaterne til kun tre lande, ellers ville listen være vej for lang til denne artikel.
Antag nu, at vi ønskede at få indbyggertallet i hvert distrikt, og vi ønskede at liste hvert distrikt sammen med dets befolkning og landekode.
Vi kunne gøre dette.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
ORDER BY CountryCode;
Resultat:
+---------------+-----------------+--------------+ | 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 | +---------------+-----------------+--------------+
Vi kan se, at vores resultater er grupperet som specificeret, og vi får nu den fulde befolkning for hvert distrikt (i modsætning til befolkningen i de enkelte byer, som er, hvordan de er gemt i den underliggende tabel).
Bemærk, at GROUP BY
klausul skal komme efter enhver WHERE
klausul og før enhver ORDER BY
klausul.
Hvis vi ønskede at få befolkningen i hvert land i stedet for distriktet, bliver vores forespørgsel endnu mere kompakt.
SELECT
CountryCode,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode
ORDER BY CountryCode;
Resultat:
+---------------+--------------+ | CountryCode | Population | |---------------+--------------| | AGO | 2561600 | | ARE | 1728336 | | AUS | 11313666 | +---------------+--------------+
Husk på, at denne særlige prøvedatabase er meget forældet, og dens befolkningstal afspejler ikke den nuværende virkelighed.
Eksempel 3 – HAVING-klausulen
Du kan inkludere koden HAVING
klausul med din GROUP BY
klausul for at filtrere grupperne.
Eksempel:
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;
Resultat:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
HAVING
klausulen ligner WHERE
klausul, bortset fra WHERE
filtrerer individuelle rækker, mens HAVING
filtrerer grupper.
Også WHERE
klausul filtrerer data før den er grupperet, hvorimod HAVING
filtrerer data efter den er grupperet.
HAVING
klausulen accepterer de samme operatorer, som du kan bruge med WHERE
klausul (såsom =
, ) Operator for Beginners">>
, =) Operator for Beginners">>=
, IN
, LIKE
osv.).