GROUP BY et HAVING
Regrouper les lignes et calculer un agrégat par groupe avec GROUP BY, filtrer les groupes avec HAVING plutôt que WHERE, et connaître l'ordre dans lequel la base évalue les clauses.
- 18 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Les chiffres
Quelques cartes du deck
GROUP BY : de quoi s'agit-il ?
Voir la réponse
Clause qui range les lignes en groupes de valeurs identiques, pour qu'un agrégat soit calculé une fois par groupe.
Le résultat compte une ligne par groupe. Dans SELECT, on ne met que les colonnes du regroupement et des agrégats.
Quelles lignes rend cette requête ?
```sql
-- client : Durand Lyon | Martin Paris | Bassam Lyon | Dao Lille
-- Leroy Paris | Rossi Milan | Conti Milan | Weber Berlin | Keller Lyon
SELECT ville, COUNT(*)
FROM client
GROUP BY ville
HAVING COUNT(*) >= 2;`- Lyon 3, Milan 2, Paris 2
- Lyon 3
- Berlin 1, Lille 1, Lyon 3, Milan 2, Paris 2
- Lyon 3, Paris 2
Voir la réponse
Lyon 3, Milan 2, Paris 2
Les groupes sont Berlin 1, Lille 1, Lyon 3, Milan 2, Paris 2. HAVING écarte Berlin et Lille, qui n'ont qu'un client. Le seuil est « au moins 2 », donc Milan et Paris restent.
Pour obtenir une ligne par ville avec le nombre de clients de chacune, on termine
SELECT ville, COUNT(*) FROM clientpar ….Voir la réponse
Pour obtenir une ligne par ville avec le nombre de clients de chacune, on termine
SELECT ville, COUNT(*) FROM clientpar GROUP BY ville.Chaque ville forme un groupe et COUNT(*) compte les lignes de ce groupe. Sans GROUP BY, la requête échoue : ville n'est pas agrégée.
HAVING : de quoi s'agit-il ?
Voir la réponse
Clause qui filtre les groupes après le regroupement, en général selon la valeur d'un agrégat.
HAVING COUNT(*) >= 2garde les groupes d'au moins deux lignes. Un groupe écarté disparaît entièrement du résultat.