GROUP BY: Het juiste gebruik ervan

  1. Inleiding
  2. Uitleg GROUP BY en gebruikte basisgegevens
  3. Fout gebruik van de GROUP BY clausule
  4. GROUP BY en verzamelingsfuncties
  5. Groeperen op meerdere kolommen
  6. GROUP BY en HAVING
  7. GROUP BY Modifiers
  8. Slotwoord en referenties
  9. Reacties op deze tutorial

GROUP BY en verzamelingsfuncties

De reden dat GROUP BY in MySQL geintroduceerd is, is dat de verzamelingsfuncties zoals bijvoorbeeld SUM() en COUNT() altijd de verzameling van alle waarden uit een kolom retourneerden. Zonder de GROUP BY functie was het dus onmogelijk om bijvoorbeeld de som van een individuele groep waarden in een kolom te vinden.

Verzamelingsfuncties (engels: aggregate functions) zijn functies die een bewerking uitvoeren op een verzameling records en het resultaat retourneren. De belangrijkste functies zijn:

AVG() - Geeft het gemiddelde van een verzameling
COUNT() - Geeft het aantal waarden in een verzameling
MAX() - Geeft de maximale waarde uit een verzameling
MIN() - Geeft de minimale waarde uit een verzameling
SUM() - Geeft de som van de waarden in een verzameling

Ter referentie ook nog even de basisgegevens:
Code
1
2
3
4
5
6
7
8
9
10
11
12
+----+-------+--------+------------+
| id | naam  | aantal | datum      |
+----+-------+--------+------------+
| 1  | Piet  | 115    | 2007-07-11 |
| 2  | Karel | 230    | 2007-07-11 |
| 3  | Piet  | 45     | 2007-07-11 |
| 4  | Kees  | 135    | 2007-07-11 |
| 5  | Tom   | 190    | 2007-07-12 |
| 6  | Karel | 150    | 2007-07-12 |
| 7  | Kees  | 30     | 2007-07-12 |
| 8  | Piet  | 90     | 2007-07-12 |
+----+-------+--------+------------+


Voorbeeld 3: De som van het aantal punten
Code
1
2
SELECT SUM(aantal) AS totaal
FROM punten

Deze query geeft als resultaat de som van het aantal punten terug. In dit geval is dat 985. Nu weet je echter alleen de som van het totaal aantal punten en nog niet wat de deelnemers individueel behaald hebben.

Stel dat we nu de volgende query proberen om ook de naam weer te geven.

Voorbeeld 4: De som van het aantal punten per deelnemer
Code
1
2
SELECT naam, SUM(aantal) AS totaal
FROM punten

Het uitvoeren van deze query geeft in de nieuwere versies van MySQL een foutmelding:
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Deze foutmelding zegt dat het onmogelijk is om in een query normale kolommen te mixen met een kolom waarop een verzamelingsfunctie is toegepast, zonder dat er GROUP BY aan te pas komt.

Voorbeeld 5: De som van het aantal punten per deelnemer (2)
Code
1
2
3
SELECT naam, SUM(aantal) AS totaal
FROM punten
GROUP BY naam

Deze query geeft het volgende resultaat:
Code
1
2
3
4
5
6
7
8
+-------+--------+
| naam  | totaal |
+-------+--------+
| Karel | 380    |
| Kees  | 165    |
| Piet  | 250    |
| Tom   | 190    |
+-------+--------+

We zien dat deze query inderdaad het totaal aantal punten per deelnemer weergeeft.

In de query van voorbeeld 5 kun je de SUM() functie natuurlijk vervangen door de andere verzamelingsfunctie. Elke functie geeft zo zijn eigen resultaat weer. Ik zal hier enkele voorbeelden van geven.

Voorbeeld 6: Het gemiddelde aantal punten per speler
Code
1
2
3
SELECT naam, AVG(aantal) AS gemiddelde
FROM punten
GROUP BY naam

Geeft het gemiddelde aantal punten per speler:
Code
1
2
3
4
5
6
7
8
+-------+------------+
| naam  | gemiddelde |
+-------+------------+
| Karel | 190.0      |
| Kees  | 82.5       |
| Piet  | 83.3       |
| Tom   | 190.0      |
+-------+------------+


Voorbeeld 7: Het minimaal aantal punten per speler
Code
1
2
3
SELECT naam, MIN(aantal) AS minimum
FROM punten
GROUP BY naam

Deze query is de oplossing van het probleem uit voorbeeld 2. Dit is de juiste manier om het minimaal aantal punten per speler op te halen:
Code
1
2
3
4
5
6
7
8
+-------+---------+
| naam  | minimum |
+-------+---------+
| Karel | 150     |
| Kees  | 30      |
| Piet  | 45      |
| Tom   | 190     |
+-------+---------+

Vorige Volgende