INSIA Bases de données ING 1 MySQL
Transcription
INSIA Bases de données ING 1 MySQL
INSIA Bases de données ING 1 MySQL – Cours et TP 03 Les fonctions de groupe et les agrégats LA BIBLE : MySQL 5.0 Reference Manual http://dev.mysql.com/doc/refman/5.0/fr/index.html Site officiel MySql : http://www-fr.mysql.com/ Documentation MySQL : http://mysql.org/ La Base de Données Open Source la plus Populaire au Monde Bertrand LIAUDET SOMMAIRE SOMMAIRE 1 CALCULS STATISTIQUES EN SQL : LES FONCTIONS DE GROUPE ET LES AGREGATS Calcul statistique élémentaire : les fonctions de groupe La fonction count () Les fonctions avg, sum, max et min Les agrégats ou regroupement : le group by 2 2 3 3 4 TP N°3 : CALCULS STATISTIQUES Présentation Exercice : interrogation de la BD 7 7 7 Première édition : septembre 2007 Deuxième édition : septembre 2008 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 Fonction de groupe Count() Agrégat Having PRINCIPALES NOTIONS Sum() Max(), Min(), Avg() Group by Calcul statistique élémentaire : les fonctions de groupe 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. Les 5 fonctions de groupe Il existe 5 fonctions de groupe (notées fdg 1 dans cet exposé) et leur syntaxe est la suivante : count(), max(), min(), sum(), avg() 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 ; Combien y a-t-il de jobs différents dans la société ? Select count (distinct job) from emp ; Les fonctions avg, sum, max et min 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 ; Les agrégats ou regroupement : le group by Présentation de la clause group by 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. En théorie, on peut avoir : Select liste 1 d'attributs , liste de fdg(attribut) from table group by liste 2 d'attributs ; avec liste 1 incluse dans 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 ) ) Détail du déroulement d’un goup by Le group by se divise en 4 étapes : 1) d'abord un "order by" : les tuples de la table de départ sont triés selon les valeurs croissantes de la liste des attributs du group by ; 2) Ensuite les calculs statistiques des fonctions de groupe : ces calculs sont appliqués aux sousensemble ayant la même valeur pour la liste d’attribut du group by ; 3) Ensuite on projette les attributs du group by avec un distinct 4) Pour chaque ligne de la nouvelle table, on peut mettre le résultat des opérations statistiques. Clé primaire d’un group by La clé primaire d’un groupe by, c’est la concaténation des attributs du group by. En effet, le distinct est effectué sur cet ensemble d’attributs. Group by sans fonctions de groupe : à éviter ! Un group by sans fonctions de groupe c'est soit une restriction-projection primaire avec order by, soit une restriction-projection avec distinct et order by. Soit le group by suivant : Select liste_1 d'attributs from table group by liste_2 d'attributs ; 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. Restrictions supplémentaires : la clause having La clause having permet d'ajouter une condition sur les résultats des fonctions de groupe associées à une clause group by: 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. ONLY FULL GROUP BY 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 Par défaut, à l’installation, la variable « sql_mode » contient : STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Soit 3 caractéristiques différentes. Pour ajouter une quatrième caractéristique, on passe la commande suivante : set @@local.sql_mode=concat(@@sql_mode,',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