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 fonction : 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 sont assez différentes 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 : SQL | 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, le prix moyen de tous les jeux :
Pour afficher cette information en PHP, on pourrait faire comme on en a l'habitude (cela fonctionne) :
Code : PHP | <?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, 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 | <?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 une fois 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 : SQL | 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 à 1 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 : SQL | 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 ? Ca ne peut pas se représenter 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. Il faudrait faire 2 requêtes si on voulait avoir ces 2 informations.
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 : SQL | 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 : SQL | 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 : SQL | 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 : SQL | 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 : SQL | 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 de Florent par exemple :
Code : SQL | 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) sur la colonne
nbre_joueurs_max comme ceci :
| 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 : SQL | 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 : SQL | 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 !