GROUP BY en HAVING
De HAVING clausule is net zoiets als een WHERE clausule en wordt in combinatie met een GROUP BY clausule gebruikt. Het verschil tussen HAVING en WHERE is dat je in een WHERE geen verzamelingsfuncties op mag nemen en in een HAVING wel.
Wederom eerst de basisgegevens waar we mee werken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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 |
+----+-------+--------+------------+
| 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 12: Deelnemers met een totaal aantal punten > 200
Dit geeft de volgende resultaten:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
+-------+--------+
| naam | totaal |
+-------+--------+
| Karel | 380 |
| Piet | 250 |
+-------+--------+
| naam | totaal |
+-------+--------+
| Karel | 380 |
| Piet | 250 |
+-------+--------+
In dit geval zijn we gebonden aan het gebruik van HAVING omdat we vergelijking met een verzamelingsfunctie als criterium gebruiken. Als we in dit geval WHERE in plaats van HAVING hadden gebruikt, hadden we een melding gekregen dat er een fout in de syntax op de plaats van de WHERE zat.
Een ander verschil tussen WHERE en HAVING is het moment waarop er op de conditie getest wordt. Bij een WHERE gebeurt dit voor de individuele records vóór het groeperen, bij een HAVING gebeurt dit voor groepstotalen na het groeperen.
Ook op dit punt wijkt MySQL weer af van de SQL standaard. Volgens de standaard mogen in een HAVING alleen kolommen opgenomen worden die in een GROUP BY clausule voorkomen of die subject zijn van een verzamelingsfunctie. MySQL echter staat toe dat in HAVING kolommen voorkomen die genoemd zijn in een SELECT, GROUP BY, externe subquery of in een verzamelingsfunctie. Wederom zou ik hier ook willen aanraden om alleen de SQL standaard te gebruiken.
« vorige pagina | volgende pagina »
Inhoudsopgave
- Inleiding
- Uitleg GROUP BY en gebruikte basisgegevens
- Fout gebruik van de GROUP BY clausule
- GROUP BY en verzamelingsfuncties
- Groeperen op meerdere kolommen
- GROUP BY en HAVING
- GROUP BY Modifiers
- Slotwoord en referenties