Les fonctions d'agrégat
Les fonctions d'agrégat
Comme précédemment, nous allons d'abord voir comment on utilise une fonction d'agrégat dans une requête SQL et comment on récupère le résultat en PHP, puis je vous présenterai une sélection de fonctions à connaître. Bien entendu, il en existe bien d'autres que vous pourrez découvrir dans la documentation. L'essentiel est de comprendre comment s'utilise ce type de fonctions : vous pourrez ensuite appliquer ce que vous connaissez à n'importe quelle autre fonction du même type.
Utiliser une fonction d'agrégat SQL
Ces fonctions diffèrent assez des précédentes. Plutôt que de modifier des valeurs une à une, elles font des opérations sur plusieurs entrées pour retourner une seule valeur.
Par exemple, ROUND permettait d'arrondir chaque prix. On récupérait autant d'entrées qu'il y en avait dans la table. En revanche, une fonction d'agrégat comme AVG renvoie une seule entrée : la valeur moyenne de tous les prix.
Regardons de près la fonction d'agrégat AVG. Elle calcule la moyenne d'un champ contenant des nombres. Utilisons-la sur le champ prix :
Code : PHP
1 |
SELECT AVG(prix) AS prix_moyen FROM jeux_video |
On donne là encore un alias au résultat donné par la fonction. La particularité, c'est que cette requête ne va retourner qu'une seule entrée, à savoir le prix moyen de tous les jeux :
prix_moyen |
28.34 |
Pour afficher cette information en PHP, on pourrait faire comme on en a l'habitude (cela fonctionne) :
Code : PHP
1 2 3 4 5 6 7 8 9 10 11 |
<?php $reponse = $bdd->query('SELECT AVG(prix) AS prix_moyen FROM jeux_video');
while ($donnees = $reponse->fetch()) { echo $donnees['prix_moyen']; }
$reponse->closeCursor();
?> |
Néanmoins, pourquoi s'embêterait-on à faire une boucle étant donné qu'on sait qu'on ne va récupérer qu'une seule entrée, puisqu'on utilise une fonction d'agrégat ?
On peut se permettre d'appeler fetch() une seule fois et en dehors d'une boucle étant donné qu'il n'y a qu'une seule entrée. Le code suivant est donc un peu plus adapté dans le cas présent :
Code : PHP
1 2 3 4 5 6 7 8 9 |
<?php $reponse = $bdd->query('SELECT AVG(prix) AS prix_moyen FROM jeux_video');
$donnees = $reponse->fetch(); echo $donnees['prix_moyen'];
$reponse->closeCursor();
?> |
Ce code est plus simple et plus logique. On récupère la première et seule entrée avec fetch() et on affiche ce qu'elle contient, puis on ferme le curseur. Inutile de le faire dans une boucle étant donné qu'il n'y a pas de seconde entrée.
N'hésitez pas à filtrer !
Bien entendu, vous pouvez profiter de toute la puissance du langage SQL pour obtenir, par exemple, le prix moyen des jeux appartenant à Patrick. Voici comment on s'y prendrait :
Code : PHP
1 |
SELECT AVG(prix) AS prix_moyen FROM jeux_video WHERE possesseur='Patrick' |
Le calcul de la moyenne ne sera fait que sur la liste des jeux qui appartiennent à Patrick. Vous pourriez même combiner les conditions pour obtenir le prix moyen des jeux de Patrick qui se jouent à un seul joueur. Essayez !
Ne pas mélanger une fonction d'agrégat avec d'autres champs
Soyez attentifs à ce point car il n'est pas forcément évident à comprendre : vous ne devez pas récupérer d'autres champs de la table quand vous utilisez une fonction d'agrégat, contrairement à tout à l'heure avec les fonctions scalaires. En effet, quel sens cela aurait-il de faire :
Code : PHP
1 |
SELECT AVG(prix) AS prix_moyen, nom FROM jeux_video |
On récupérerait d'un côté le prix moyen de tous les jeux et de l'autre la liste des noms de tous les jeux… Il est impossible de représenter ceci dans un seul et même tableau.
Comme vous le savez, SQL renvoie les informations sous la forme d'un tableau. Or on ne peut pas représenter la moyenne des prix (qui tient en une seule entrée) en même temps que la liste des jeux. Si on voulait obtenir ces deux informations il faudrait faire deux requêtes.
Présentation de quelques fonctions d'agrégat utiles
AVG : calculer la moyenne
C'est la fonction que l'on vient d'étudier pour découvrir les fonctions d'agrégat. Elle retourne la moyenne d'un champ contenant des nombres :
Code : PHP
1 |
SELECT AVG(prix) AS prix_moyen FROM jeux_video |
SUM : additionner les valeurs
La fonction SUM permet d'additionner toutes les valeurs d'un champ. Ainsi, on pourrait connaître la valeur totale des jeux appartenant à Patrick :
Code : PHP
1 |
SELECT SUM(prix) AS prix_total FROM jeux_video WHERE possesseur='Patrick' |
MAX : retourner la valeur maximale
Cette fonction analyse un champ et retourne la valeur maximale trouvée. Pour obtenir le prix du jeu le plus cher :
Code : PHP
1 |
SELECT MAX(prix) AS prix_max FROM jeux_video |
MIN : retourner la valeur minimale
De même, on peut obtenir le prix du jeu le moins cher :
Code : PHP
1 |
SELECT MIN(prix) AS prix_min FROM jeux_video |
COUNT : compter le nombre d'entrées
La fonction COUNT permet de compter le nombre d'entrées. Elle est très intéressante mais plus complexe. On peut en effet l'utiliser de plusieurs façons différentes.
L'utilisation la plus courante consiste à lui donner * en paramètre :
Code : PHP
1 |
SELECT COUNT(*) AS nbjeux FROM jeux_video |
On obtient ainsi le nombre total de jeux dans la table.
On peut bien entendu filtrer avec une clause WHERE, pour obtenir le nombre de jeux appartenant à Florent par exemple :
-
Code : PHP
1 |
SELECT COUNT(*) AS nbjeux FROM jeux_video WHERE possesseur='Florent' |
Il est possible de compter uniquement les entrées pour lesquelles l'un des champs n'est pas vide, c'est-à-dire qu'il ne vaut pas NULL. Il n'y a pas de jeu de ce type dans notre table jeux_video, mais supposons que pour certains jeux on ne connaisse pas le nombre de joueurs maximum. On laisserait certaines entrées vides, ce qui aurait pour effet d'afficher NULL (pas de valeur) dans la colonne nbre_joueurs_max (comme dans le tableau suivant).
Champs vides dans une table |
||||||
ID |
nom |
possesseur |
console |
prix |
nbre_joueurs_max |
commentaires |
1 |
Super Mario Bros |
Florent |
NES |
4 |
NULL |
Un jeu d'anthologie ! |
2 |
Sonic |
Patrick |
Megadrive |
2 |
NULL |
Pour moi, le meilleur jeu au monde ! |
3 |
Zelda : ocarina of time |
Florent |
Nintendo 64 |
15 |
1 |
Un jeu grand, beau et complet comme on en voit rarement de nos jours |
4 |
Mario Kart 64 |
Florent |
Nintendo 64 |
25 |
4 |
Un excellent jeu de kart ! |
5 |
Super Smash Bros Melee |
Michel |
GameCube |
55 |
NULL |
Un jeu de baston délirant ! |
Dans ce cas, on peut compter uniquement les jeux qui ont un nombre de joueurs maximum défini. On doit indiquer en paramètre le nom du champ à analyser :
Code : PHP
1 |
SELECT COUNT(nbre_joueurs_max) AS nbjeux FROM jeux_video |
Dans notre exemple, seuls les jeux Zelda et Mario Kart seront comptés car on connaît leur nombre de joueurs maximum. Donc on obtiendra « 2 » en réponse.
Enfin, il est possible de compter le nombre de valeurs distinctes sur un champ précis. Par exemple dans la colonne possesseur, Florent apparaît plusieurs fois, Patrick aussi, etc. Mais combien y a-t-il de personnes différentes dans la table ? On peut le savoir en utilisant le mot-cléDISTINCT devant le nom du champ à analyser, comme ceci :
Code : PHP
1 |
SELECT COUNT(DISTINCT possesseur) AS nbpossesseurs FROM jeux_video |
On peut ainsi facilement savoir combien de personnes différentes sont référencées dans la table. Essayez de faire de même pour connaître le nombre de consoles différentes dans la table !
Créé avec HelpNDoc Personal Edition: Maximisez la protection de vos PDF en suivant ces étapes simples