Comprendre GROUP BY, WHERE et HAVING en SQL
Quand on débute en SQL, la différence entre GROUP BY, WHERE et HAVING peut sembler confuse. Pourtant, ces trois mots-clés jouent des rôles bien distincts dans une requête. Bien les comprendre est essentiel pour manipuler et analyser les données efficacement.
1. GROUP BY : regrouper pour mieux analyser
Le mot-clé GROUP BY permet de regrouper les lignes d’un tableau en fonction d’une ou plusieurs colonnes. Chaque groupe peut ensuite être résumé par des fonctions d’agrégation comme COUNT
, SUM
, AVG
, MAX
ou MIN
.
Exemple classique : compter le nombre d’employés par département.
SELECT departement, COUNT(*) AS nb_employes
FROM employes
GROUP BY departement;
👉 Résultat : chaque département apparaît une seule fois, avec le nombre total d’employés.
Sans fonction d’agrégation, GROUP BY se rapproche de DISTINCT. Par exemple :
SELECT departement
FROM employes
GROUP BY departement;
👉 Ce code renvoie la liste unique des départements. Mais l’intérêt principal de GROUP BY reste le regroupement avec agrégation.
2. WHERE : filtrer les lignes avant regroupement
Le mot-clé WHERE sert à restreindre les données brutes, avant toute opération de regroupement. Il agit directement sur les lignes du tableau.
Exemple : compter seulement les employés dont le salaire dépasse 2 000 €.
SELECT departement, COUNT(*) AS nb_employes
FROM employes
WHERE salaire > 2000
GROUP BY departement;
👉 Ici, seules les lignes correspondant aux employés bien rémunérés sont prises en compte dans le regroupement.
3. HAVING : filtrer les groupes après regroupement
La clause HAVING intervient après le GROUP BY. Elle permet de filtrer les groupes en fonction des résultats d’agrégats.
Exemple : sélectionner uniquement les départements qui comptent plus de 5 employés.
SELECT departement, COUNT(*) AS nb_employes
FROM employes
GROUP BY departement
HAVING COUNT(*) > 5;
👉 Contrairement à WHERE, vous pouvez utiliser ici une fonction d’agrégation (COUNT, AVG, etc.) car les données ont déjà été regroupées.
4. Combiner WHERE et HAVING
Dans une même requête, vous pouvez utiliser les deux clauses ensemble :
SELECT departement, AVG(salaire) AS salaire_moyen
FROM employes
WHERE salaire > 2000 -- filtre sur les lignes individuelles
GROUP BY departement
HAVING AVG(salaire) > 3000; -- filtre sur les groupes agrégés
👉 Ce code sélectionne uniquement les départements où :
- Les employés gagnent plus de 2 000 € (filtre WHERE),
- Et où le salaire moyen dépasse 3 000 € (filtre HAVING).
Aucune page ou chapitre n'a été ajouté à cet article.