GROUP BY en verzamelingsfuncties

De reden dat GROUP BY in MySQL geïntroduceerd 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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT naam, SUM(aantal) AS totaal
FROM punten
GROUP BY naam

Deze query geeft het volgende resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT naam, AVG(aantal) AS gemiddelde
FROM punten
GROUP BY naam

Geeft het gemiddelde aantal punten per speler:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
+-------+---------+
| naam  | minimum |
+-------+---------+
| Karel | 150     |
| Kees  | 30      |
| Piet  | 45      |
| Tom   | 190     |
+-------+---------+

« Lees de omschrijving en reacties

Inhoudsopgave

  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

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.