Académique Documents
Professionnel Documents
Culture Documents
Bases de données
ING 1
MySQL – Cours et TP 03
Les fonctions de groupe et les agrégats
SOMMAIRE
SOMMAIRE 1
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 1/8 - Bertrand LIAUDET
CALCULS STATISTIQUES EN SQL :
LES FONCTIONS DE GROUPE ET LES AGREGATS
PRINCIPALES NOTIONS
Fonction de groupe Sum()
Count() Max(), Min(), Avg()
Agrégat Group by
Having
Présentation
Les fonctions de groupe permettent de faire des calculs statistiques sur cet ensemble de
tuples.
Les fonctions de groupe interviennent dans la projection : elles s’intéressent donc à la
colonne projetée.
Une fonction de groupe est une fonction qui s'applique non pas à la valeur d’un attribut pour
un tuple (comme la fonction sinus ou la fonction logarithme), mais à toutes les valeurs d’un
attribut pour tous les tuples de la table traitée, donc à toute la colonne pour un attribut
donné.
Par exemple, max() est une fonction de groupe qui détermine le maximum des valeurs d’un
attribut pour tous les tuples de la table traitée.
Une fonction de groupe produit donc un tuple et un seul comme résultat.
Elle permet donc de créer un nouvel attribut à partir d'un attribut en entrée.
On peut projeter plusieurs fonctions de groupe (calculer le max, le min, la moyenne).
Par contre, la projection d’une fonction de groupe empêche la simple projection d’un autre
attribut de la table.
Syntaxe SQL
La syntaxe d'une projection de fonction de groupe est la suivante2 :
Select fdg( attribut ) from table ;
1 fdg (fonction de groupe) n'est pas un mot clé du SQL mais une expression de notre métalangage.
2 Remarques sur le métalangage utilisé : il ne prétend pas être parfaitement formel! Son objectif est d'associer
pédagogie et rigueur formelle. Les mots clés du langage SQL sont en gras (Select). Les expressions générales sont
en italiques (liste d'attributs). Les explications concernant ces expressions générales sont données soit en note, soit
dans le texte, soit à travers des exemples. Les cas particuliers des exemples sont au format standard (NE, nom).
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 2/8 - Bertrand LIAUDET
Remarques
Quand on projette une fonction de groupe, on ne peut plus projeter d’attribut simple.
On ne peut pas écrire :
Select fdg (att1), att2 from table ;
La fonction count ()
Présentation
count permet de compter le nombre de tuples renseignés (non NULL) d'une table pour le ou les
attributs spécifiés.
Exemple
pour savoir combien il y a de salariés dans la société, on écrira :
Select count (*) from emp ;
Remarque
On peut aussi écrire :
Select count (NE) from emp ;
NE étant la clé primaire, NE ne peut pas être NULL et le résultat est le même qu’avec count(*).
Quand on veut compter toutes les lignes de la table, mieux vaut utiliser count(*).
Exemples
Combien il y a personnes qui sont susceptibles d’avoir une commission ?
Select count (comm) from emp ;
Présentation
avg, sum, max et min fournissent respectivement la moyenne, la somme, le maximum et le
minimum d'un attribut donné :
Exemples
Quel est le salaire moyen de la société :
Select avg(sal) from emp ;
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 3/8 - Bertrand LIAUDET
Quelle est la somme des salaires de la société :
Select sum (sal) from emp ;
Quels sont les salaires minimums et maximums de la société :
Select min (sal), max(sal) from emp ;
Principe
La clause group by permet de faire des regroupements par valeur possible d’un attribut et de
faire des statistiques sur les regroupements ainsi définis.
Exemple
On souhaite connaître, pour chaque fonction (job), le nombre d'employés et le salaire moyen :
Select job, count(*), avg(sal)
from emp
group by job;
ou encore quels sont les salaires maximums de chaque département :
Select deptno, max(sal) from emp
group by deptno ;
La clause group by permet d'appliquer des fonctions de groupes à des sous ensembles de la table
de départ.
Syntaxe SQL
En pratique, la syntaxe usuelle de la clause group by est la suivante :
Select liste d'attributs , liste de fdg(attribut)
from table
group by liste d'attributs ;
En général, la liste de tri et de restriction et la même que la liste de projection : la liste 1 est
identique à la liste 2.
Syntaxe AR
En algèbre relationnelle, la fonction de groupe sans agrégat est un cas particulier de l’agrégéat.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 4/8 - Bertrand LIAUDET
Ainsi, l’agrégat s’écrit :
Tres = Agreg(table ; attributs du group by ; liste de fdg(attribut ) )
La fonction de groupe dans agrégat s’écrit de la même façon, sans attributs du groupe by
Tres = Agreg(table ; ; liste de fdg(attribut ) )
Si la liste 2 ne contient pas la clé primaire, la clause group by est équivalente à la clause distinct
associée à la clause order by :
Select distinct liste d'attributs from table
order by liste d'attributs ;
Si la liste 2 contient la clé primaire, alors il n'y a pas de restriction (pas de distinct) et la clause
group by est équivalente à la clause order by :
Select liste d'attributs from table
order by liste_2 d'attributs;
Dans tous les cas, il faut éviter les group by sans fonctions de groupe.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 5/8 - Bertrand LIAUDET
Select liste d'attributs , liste de fdg(attribut )
from table
group by liste d'attributs
having formule logique de sélection des fdg(attribut );
Quelles sont les fonctions (job) pour lesquelles travaillent plus de trois personnes:
Select job, count(*) from emp
group by job
having count(*) >=3;
ou encore:
Select job from emp
group by job
having count(*) >=3;
On préfèrera la première écriture car on préfère projeter les attributs de restriction.
Présentation
La présentation précédent décrit le fonctionnement standard du group by.
On ne peut projeter que les attributs de regroupement et ceux des fonctions de groupe.
Toutefois, MySQL permet de projeter n’importe quel autre attribut.
Cette possibilité permet à MySQL d’accélérer les traitements. Toutefois, elle n’est pas standard.
On l’évitera donc systématiquement dans ce cours.
Pour cela, il faut faire entrer tous les attributs projetés dans le « group by »
« sql_mode » et « ONLY_FULL_GROUP_BY »
La variable « sql_mode » permet de paramétrer un « group by » standard.
Pour cela, elle doit prendre la valeur : ONLY_FULL_GROUP_BY
Pour que cette caractéristique soit prise en compte par tout nouveau client, on passe la
commande suivante :
set @@global.sql_mode=concat(@@sql_mode,',ONLY_FULL_GROUP_BY');
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 6/8 - Bertrand LIAUDET
TP N°3 : CALCULS STATISTIQUES
Présentation
L’exercice consiste à écrire des requêtes SQL d’interrogation de la BD.
On utilise la base des employés créée à partir du script employesTP01.txt (après correction des
erreurs) ou employesTP02.txt.
Exercice : interrogation de la BD
Table de travail
On travaillera sur la table suivante :
EMP(NE, NOM, JOB, DATEMB, SAL, COMM, ND)
• NE numéro de l’employé. Clé primaire.
• NOM nom de l’employé.
• JOB intitulé du poste occupé.
• DATEMB date d’embauche.
• SAL salaire de l’employé.
• COMM commission (part de salaire variable).
• ND n° du département dans lequel travaille l’employé.
Travail à faire
Dans le fichier texte du TP 02, ajouter de nouvelles requêtes.
Les requêtes
21. Combien d'employés dans la société
22. Combien d'employés embauchés en 1981
23. Combien de départements non vides dans la société
24. Combien de vendeurs (« Salesman ») dans la société
25. Combien de jobs différents dans la société
26. Combien y a-t-il d’employés qui n’ont pas et ne peuvent pas avoir de commission ?
27. Salaires minimum, maximum et moyen de la société
28. Salaires moyens des vendeurs
29. Salaires moyens de tous les employés en tenant compte des commissions
30. Pourcentage moyen de la commission des vendeurs par rapport à leur salaire
31. Quel est le salaire moyen, les salaires min et max et le nombre d’employé par profession ?
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 7/8 - Bertrand LIAUDET
32. Quels sont les salaires maximums de chaque département ?
33. Quels sont les départements dans lesquels travaillent plus de deux personnes et quels sont les
salaires moyens dans ces départements ?
34. Quels sont les départements dans lequel il y a plus que 4 personnes ?
35. Quels sont les jobs pour lesquels la moyenne du salaire est supérieure à 2000 ?
36. Combien y a-t-il d’employés par département et par fonction et quelle est la moyenne de
leurs salaires ?
37. Quel est le nombre d’employés par année d’embauche ?
38. Combien y a-t-il d’employés par tranches de salaire de 1000 (0 à 999, 1000 à 1999, etc.).
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 03 - page 8/8 - Bertrand LIAUDET