Clause GROUP BY
Cette clause permet de créer des sous-ensembles (regroupements) de lignes pour lesquels la valeur d'une (ou plusieurs) colonne est identique. Cette clause est liée à l'utilisation de fonctions statistiques qui seront appliquées sur les sous-ensembles définis par GROUP BY.
- Regroupement par grade des enseignants
SELECT Grade FROM ENSEIGNANT GROUP BY Grade;
Cette requête va créer autant de sous-ensembles que de valeurs possibles de l'attribut Grade. Ici 3 sous-ensembles : ASS, MCF, PR.
Clause HAVING
Cette clause, contrairement à la clause WHERE qui précise les conditions à appliquer sur les lignes d'une table, permet de préciser des conditions au niveau des sous-ensembles créés par GROUP BY.
- Regroupement par grade des enseignants de type 'ASS'
SELECT Grade FROM ENSEIGNANT GROUP BY Grade HAVING Grade='ASS';
Fonctions statistiques
Fonctions | Rôle |
COUNT([DISTINCT] expr [alias] | Renvoie le nombre de valeurs dans la colonne. Si DISTINCT est précisé, les doublons sont éliminés. |
COUNT(*) | Compte toutes les lignes de la table. |
AVG(expr [alias]) | Renvoie la moyenne des valeurs de la colonne spécifiée. |
MIN(expr [alias]) | Renvoie la plus petite valeur de la colonne spécifiée. |
MAX(expr [alias]) | Renvoie la plus grande valeur de la colonne spécifiée. |
SUM(expr [alias]) | Renvoie la somme des valeurs de la colonne spécifiée. |
- Afficher la date de naissance de l'étudiant le plus jeune et de l'étudiant le plus âgé.
SELECT MIN(Dtnaiss) AS "Plus jeune", MAX(Dtnaiss) AS "Plus âgé" FROM ETUDIANT;
- Afficher le nombre total d'étudiants
SELECT COUNT(*) FROM ETUDIANT;
Tester les exemples
Fonctions statistiques et clause GROUP BY
Les fonctions statistiques opèrent sur un ensemble de données et renvoient une valeur unique. D'une manière générale, lorsqu'un attribut est sélectionné dans une clause SELECT le résultat pourra comporter de zéro à n valeurs ce qui peut provoquer des conflits lorsque l'on utilise conjointement des fonctions statistiques qui elles ne renvoient qu'une seule valeur.
L'ordre SELECT suivant, supposé calculer la moyenne des notes par étudiant, est donc incorrect et va générer l'erreur d'exécution : "Invalid column reference"
SELECT Numetu, AVG(Note) FROM NOTES;
La formulation correcte est :
SELECT Numetu, AVG(Note) FROM NOTES GROUP BY Numetu;
Dans ce cas, un sous-ensemble va être créé pour chaque numéro étudiant et la moyenne sera calculée au niveau du sous-ensemble.
Tester les exemples
Q07 : Afficher pour chaque étudiant, identifié par son nom, le nombre total de notes qu'il a obtenues.
Q08 : Afficher le nom des étudiants qui ont moins de 4 notes.
Q09 : Afficher le nom du premier et du dernier étudiant sur la liste alphabétique.
Q10 : Afficher pour chaque matière (numéro) le nombre d'étudiants qui ont une note.