Brigade des Requêtes

Chapitre 4 : GROUP BY, HAVING

Le Groupement des Preuves

Une agrégation globale donne un seul chiffre. GROUP BY permet de découper les lignes en paquets (un par quartier, par type...) et de calculer un bilan pour chaque paquet. HAVING filtre ensuite ces paquets.

GROUP BY : un bilan par groupe

Nombre de crimes par quartier
SELECT quartier, COUNT(*) AS nb_crimes
FROM crimes
GROUP BY quartier;

SQL range les lignes dans un paquet par valeur distincte de quartier, puis calcule COUNT(*) dans chaque paquet. On peut regrouper sur plusieurs colonnes : GROUP BY quartier, type.

HAVING : filtrer après le regroupement

WHERE filtre les lignes avant le regroupement ; HAVING filtre les groupes après l'agrégation. On ne peut donc pas écrire WHERE COUNT(*) > 3.

Les quartiers avec plus de 4 crimes
SELECT quartier, COUNT(*) AS nb_crimes
FROM crimes
GROUP BY quartier
HAVING COUNT(*) > 4;
Les deux ensemble : WHERE d'abord, HAVING ensuite
SELECT quartier, COUNT(*) AS nb_graves
FROM crimes
WHERE gravite >= 4
GROUP BY quartier
HAVING COUNT(*) >= 2
ORDER BY nb_graves DESC;

L'ordre d'une requête complète

Écrit dans cet ordreRôle
SELECTles colonnes / calculs à afficher
FROMla table
WHEREfiltre les lignes
GROUP BYforme les groupes
HAVINGfiltre les groupes
ORDER BYtrie le résultat
LIMITlimite le nombre de lignes

À toi de jouer : Exercice guidé

Affiche chaque type de crime avec son nombre de cas, mais seulement ceux qui apparaissent plus de 3 fois.

Passer à l'énigme : Le quartier en feu