Veel van de kracht van relationele databases komt voort uit het filteren van gegevens en het samenvoegen van tabellen. Daarom vertegenwoordigen wij in de eerste plaats die relaties. Maar moderne databasesystemen bieden nog een andere waardevolle techniek: groeperen.
Door te groeperen kunt u samenvattende informatie uit een database halen. Hiermee kunt u resultaten combineren om nuttige statistische gegevens te creëren. Door te groeperen hoeft u geen code te schrijven voor veelvoorkomende gevallen, zoals het middelen van lijsten met cijfers. En het kan zorgen voor efficiëntere systemen.
Wat doet de GROUP BY-clausule?
GROUP BY, zoals de naam al doet vermoeden, resulteert groepen in een kleinere set. De resultaten bestaan uit één rij voor elke afzonderlijke waarde van de gegroepeerde kolom. We kunnen het gebruik ervan laten zien door enkele voorbeeldgegevens te bekijken met rijen die enkele gemeenschappelijke waarden delen.
Het volgende is een zeer eenvoudige database met twee tabellen die recordalbums vertegenwoordigen. U kunt zo'n database opzetten door
een basisschema schrijven voor het door u gekozen databasesysteem. De albums table heeft negen rijen met een primaire sleutel ID kaart kolom en kolommen voor naam, artiest, jaar van uitgave en verkoop:++++++
id | naam | artist_id | release_year | verkoop |
++++++
1 | Abbey Road | 1 | 1969 | 14 |
2 | De donkere kant van de maan | 2 | 1973 | 24 |
3 | Geruchten | 3 | 1977 | 28 |
4 | Laat maar | 4 | 1991 | 17 |
5 | Dieren | 2 | 1977 | 6 |
6 | Vaarwel Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
9 | Bat Out of Hell | 7 | 1977 | 28 |
++++++
De kunstenaars tafel is nog eenvoudiger. Het heeft zeven rijen met ID- en naamkolommen:
+++
id | naam |
+++
1 | The Beatles |
2 | Pink Floyd |
3 | Fleetwood Mac |
4 | Nirvana |
5 | Elton John |
6 | Adele |
7 | Gehaktbrood |
+++
U kunt verschillende aspecten van GROUP BY begrijpen met slechts een eenvoudige dataset zoals deze. Natuurlijk zou een real-life dataset veel, veel meer rijen bevatten, maar de principes blijven hetzelfde.
Groeperen op basis van één kolom
Laten we zeggen dat we willen weten hoeveel albums we hebben voor elke artiest. Begin met een typisch SELECTEER vraag om de kolom artist_id op te halen:
SELECTEER artiest_id UIT albums
Dit retourneert alle negen rijen, zoals verwacht:
++
artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
++
Voeg de zin toe om deze resultaten op artiest te groeperen GROEP BY artist_id:
SELECTEER artist_id UIT albums GROUP BY artist_id
Wat de volgende resultaten geeft:
++
artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
++
Er zijn zeven rijen in de resultatenset, verminderd met het totaal van negen in de albums tafel. Elk uniek artist_id heeft een enkele rij. Voeg ten slotte toe om de werkelijke tellingen te krijgen AANTAL (*) naar de geselecteerde kolommen:
SELECT artiest-id, COUNT (*)
VAN albums
GROEP BY artist_id
+++
artist_id | AANTAL (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++
De resultaten groeperen twee paar rijen voor de artiesten met ID's 2 en 6. Elk heeft twee albums in onze database.
Verwant: De essentiële SQL-opdrachten Cheat Sheet voor beginners
Toegang krijgen tot gegroepeerde gegevens met een geaggregeerde functie
Mogelijk hebt u de AANTAL functie eerder, met name in de AANTAL (*) vorm zoals hierboven te zien. Het haalt het aantal resultaten op in een set. U kunt het gebruiken om het totale aantal records in een tabel te krijgen:
SELECTEER AANTAL (*) UIT albums
++
AANTAL (*) |
++
| 9 |
++
COUNT is een geaggregeerde functie. Deze term verwijst naar functies die waarden uit meerdere rijen in één waarde vertalen. Ze worden vaak gebruikt in combinatie met de GROUP BY-instructie.
In plaats van alleen het aantal rijen te tellen, kunnen we een aggregatiefunctie toepassen op gegroepeerde waarden:
SELECT artist_id, SUM (verkoop)
VAN albums
GROEP BY artist_id
+++
artist_id | SUM (verkoop) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++
De totale verkopen die hierboven worden weergegeven voor artiesten 2 en 6, zijn de gecombineerde verkopen van hun meerdere albums:
SELECT artist_id, verkoop
VAN albums
WAAR artist_id IN (2, 6)
+++
artist_id | verkoop |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++
Groeperen op meerdere kolommen
U kunt op meer dan één kolom groeperen. Voeg gewoon meerdere kolommen of uitdrukkingen toe, gescheiden door komma's. De resultaten worden gegroepeerd op basis van de combinatie van deze kolommen.
SELECT release_year, sales, count (*)
VAN albums
GROUP BY release_year, sales
Dit levert doorgaans meer resultaten op dan groeperen op één kolom:
++++
release_year | verkoop | tellen (*) |
++++
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
++++
Merk op dat in ons kleine voorbeeld slechts twee albums hetzelfde jaar van uitgave en hetzelfde aantal verkopen hebben (28 in 1977).
Handige verzamelfuncties
Behalve COUNT werken verschillende functies goed met GROUP. Elke functie retourneert een waarde op basis van de records die bij elke resultaatgroep horen.
- COUNT () retourneert het totale aantal overeenkomende records.
- SUM () retourneert het totaal van alle waarden in de gegeven kolom opgeteld.
- MIN () retourneert de kleinste waarde in een bepaalde kolom.
- MAX () retourneert de grootste waarde in een bepaalde kolom.
- AVG () retourneert het gemiddelde gemiddelde. Het is het equivalent van SUM () / COUNT ().
U kunt deze functies ook gebruiken zonder een GROUP-clausule:
SELECTEER AVG (verkoop) UIT albums
++
AVG (verkoop) |
++
| 19.1111 |
++
GROUP BY gebruiken met een WHERE-clausule
Net als bij een normale SELECT, kunt u nog steeds WHERE gebruiken om de resultatenset te filteren:
SELECT artiest-id, COUNT (*)
VAN albums
WAAR release_year> 1990
GROEP BY artist_id
+++
artist_id | AANTAL (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++
Nu heb je alleen de albums die na 1990 zijn uitgebracht, gegroepeerd op artiest. U kunt ook een join gebruiken met de WHERE-component, onafhankelijk van de GROUP BY:
SELECTEER naam, COUNT (*) AS albums
VAN albums l, artiesten r
WAAR artist_id = r.id
EN release_year> 1990
GROEP BY artist_id
+++
naam | albums |
+++
Nirvana | 1 |
Adele | 2 |
+++
Houd er echter rekening mee dat als u probeert te filteren op basis van een geaggregeerde kolom:
SELECTEER naam, COUNT (*) AS albums
VAN albums l, artiesten r
WAAR artist_id = r.id
EN albums> 2
GROEP BY artist_id;
U krijgt een foutmelding:
FOUT 1054 (42S22): Onbekende kolom 'albums' in 'where-clausule'
Kolommen op basis van geaggregeerde gegevens zijn niet beschikbaar voor de WHERE-clausule.
Gebruikmakend van de HAVING-clausule
Dus, hoe filter je de resultatenset nadat een groepering heeft plaatsgevonden? De HEBBEN clausule behandelt deze behoefte:
SELECTEER naam, COUNT (*) AS albums
VAN albums l, artiesten r
WAAR artist_id = r.id
GROEP BY artist_id
HAVING albums> 1;
Merk op dat de HAVING-clausule na de GROUP BY komt. Anders is het in wezen een eenvoudige vervanging van de WAAR door HAVING. De resultaten zijn:
+++
naam | albums |
+++
Pink Floyd | 2 |
Adele | 2 |
+++
U kunt nog steeds een WHERE-voorwaarde gebruiken om de resultaten vóór de groepering te filteren. Het werkt samen met een HAVING-clausule voor filteren na de groepering:
SELECTEER naam, COUNT (*) AS albums
VAN albums l, artiesten r
WAAR artist_id = r.id
EN release_year> 1990
GROEP BY artist_id
HAVING albums> 1;
Slechts één artiest in onze database heeft na 1990 meer dan één album uitgebracht:
+++
naam | albums |
+++
Adele | 2 |
+++
Resultaten combineren met GROUP BY
De GROUP BY-instructie is een ongelooflijk nuttig onderdeel van de SQL-taal. Het kan beknopte informatie van gegevens bieden, bijvoorbeeld voor een inhoudspagina. Het is een uitstekend alternatief voor het ophalen van grote hoeveelheden data. De database kan deze extra werklast goed aan, aangezien het door zijn ontwerp optimaal is voor de taak.
Als u eenmaal begrijpt hoe u kunt groeperen en hoe u aan meerdere tafels kunt deelnemen, kunt u de meeste kracht van een relationele database gebruiken.
Leer hoe u SQL-joins gebruikt om query's te stroomlijnen, tijd te besparen en u het gevoel te geven dat u een SQL-hoofdgebruiker bent.
- Programmeren
- SQL
Bobby is een technologieliefhebber die het grootste deel van twee decennia als softwareontwikkelaar heeft gewerkt. Hij is gepassioneerd door gamen, werkt als recensie-editor bij Switch Player Magazine en is ondergedompeld in alle aspecten van online publiceren en webontwikkeling.
Abonneer op onze nieuwsbrief
Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!
Nog een stap…!
Bevestig uw e-mailadres in de e-mail die we u zojuist hebben gestuurd.