La clause HAVING s'emploie presque toujours avec un GROUP BY 1.
Elle ressemble au WHERE puisqu'elle permet de spécifier une condition. La différence est que la condition spécifiée sera appliquée sur les lignes regroupées et non sur les lignes originales de la table.
Ex : La requête suivante permet d'afficher l'identifiant des factures dont le total dépasse 50$.
SELECT facture_id
FROM lignesfactures
GROUP BY facture_id
HAVING SUM(prix) > 50;
La plupart du temps, la condition qui suit le HAVING utilisera une fonction d'aggrécation (ex : SUM, COUNT, AVG, MAX, MIN), comme dans l'exemple précédent.
Regardons d'un peu plus près le rôle de différents mots-clés dans une requête SQL. Nous allons partir d'une requête simple que nous allons préciser jusqu'à l'utilisation d'un HAVING.
Pour savoir combien on a de voitures au total :
SELECT COUNT(*) FROM voitures;
Résultat : 6
Ici, on obtient le nombre total de voitures dans la table.
Pour savoir combien on a de voitures pour le modèle 3 :
SELECT COUNT(*) FROM voitures WHERE modele_id = 3;
Résultat : 2
On voit donc qu'il y a deux voitures pour le modèle 3.
Pour savoir combien on a de voitures pour chacun des modèles :
SELECT modele_id, COUNT(*) FROM voitures GROUP BY modele_id;
Résultat :
modele_id |
COUNT(*) |
---|---|
2 |
1 |
3 |
2 |
8 |
1 |
10 |
2 |
Il y a eu un COUNT(*) pour chaque sous-ensemble de la table originale (pour chaque modèle).
Le GROUP BY permet d'obtenir avec une seule requête le résultat qu'on aurait obtenu en faisant un WHERE pour chaque modele_id.
Pour n’avoir que les modèles pour lesquels on a deux voitures ou plus :
SELECT modele_id FROM voitures GROUP BY modele_id HAVING COUNT(*) >= 2;
Résultat :
modele_id |
---|
3 |
10 |
On voit que cette requête a appliqué une condition sur chacun des sous-ensembles obtenus par le GROUP BY.
1. Explications sur la clause HAVING utiisée sans GROUP BY.
Soit la requête SELECT * FROM clients HAVING ville = 'Victoriaville';
Puisqu'il n'y a pas de GROUP BY, MySQL considère tous les enregistrements comme un seul groupe.
Cette requête sera donc l'équivalent de SELECT * FROM clients WHERE ville = 'Victoriaville';
Il existe d'autres exemples de requêtes HAVING sans GROUP BY mais ceci dépasse le cadre de cette formation.
▼Publicité