Formation PUB200 : MySQL, 2018 Options pour préciser un SELECT

9.7 Condition sur un regroupement : HAVING


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$.

MySQL

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.

Requête simple

Pour savoir combien on a de voitures au total :

MySQL

SELECT COUNT(*) FROM voitures;

Résultat : 6

Ici, on obtient le nombre total de voitures dans la table.

WHERE

Pour savoir combien on a de voitures pour le modèle 3 :

MySQL

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.

GROUP BY

Pour savoir combien on a de voitures pour chacun des modèles :

MySQL

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.

HAVING

Pour n’avoir que les modèles pour lesquels on a deux voitures ou plus :

MySQL

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. 

Note

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é

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre