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