MySQL propose toute une série de fonctions qui permettent de faire des stats sur vos tables, en résumé...
Les fonctions courantes
| Fonction | Explication | Exemple | Résultat |
|---|
| COUNT() |
Nombre de lignes |
Code : SQL1 | SELECT COUNT(nws_id) FROM t_news;
|
|
6 |
| MAX() |
Renvoie la valeur maximale |
Code : SQL1 | SELECT MAX(nws_nb_vues) FROM t_news;
|
|
2154 |
| MIN() |
Renvoie la valeur minimale |
Code : SQL1 | SELECT MIN(nws_nb_vues) FROM t_news;
|
|
0 |
| SUM() |
Renvoie la somme des valeurs |
Code : SQL1 | SELECT SUM(nws_nb_vues) FROM t_news;
|
|
4407 |
| AVG() |
Renvoie la moyenne (Average) des valeurs |
Code : SQL1 | SELECT AVG(nws_nb_vues) FROM t_news;
|
|
734.5000 |
Les fonctions de linéarisation
Il existe également d'autres fonctions permettant de calculer la variance et l'écart-type d'une population ou d'un échantillon (pour ceux qui sont allergiques aux maths, je propose que vous évitiez d'essayer de comprendre ce paragraphe

).
Ce sera certainement utile à quelques uns d'entre vous, donc je vous mets ces fonctions au nombre de 4 si on ne compte pas les dérivés non-standards créés par MySQL (on se demande pourquoi d'ailleurs...).
| Fonction | Explication | Exemple | Résultat |
|---|
| VAR_POP |
Variance d'une population |
Code : SQL1 | SELECT VAR_POP(nws_nb_vues) FROM t_news;
|
|
608275.5833 |
| STDDEV_POP |
Ecart-type d'une population |
Code : SQL1 | SELECT STDDEV_POP(nws_nb_vues) FROM t_news;
|
|
779.9202 |
| VAR_SAMP |
Variance d'un échantillon |
Code : SQL1 | SELECT VAR_SAMP(nws_nb_vues) FROM t_news;
|
|
729930.7000 |
| STDDEV_SAMP |
Ecart-type d'un échantillon |
Code : SQL1 | SELECT STDDEV_SAMP(nws_nb_vues) FROM t_news;
|
|
854.3598 |
Évidemment, comme nous avons des données qui ne se prêtent pas vraiment à la linéarité, les variances et écarts-types sont absolument... anarchiques.

Avec des vraies données vous aurez bien sûr des résultats plus raisonnables.
Pour ceux qui commencent à attraper des boutons, rassurez-vous, les maths c'est à peu près terminé.
Quelques notes par rapport à tout ça...
COUNT(DISTINCT champ)
Je vous ai présenté la fonction COUNT() sous sa forme la plus simple, il y a plusieurs subtilités relativement intéressantes.
A commencer par le fait d'ajouter DISTINCT avant le nom de la colonne, ce qui permet, vous vous en doutez certainement, de ne pas prendre en compte les doublons.
Un petit exemple :
Code : SQL1 | SELECT COUNT(nws_auteur) AS nbr_tot, COUNT(DISTINCT nws_auteur) AS nbr_distinct FROM t_news;
|
Pour rappel on a 6 news écrites par Alexi, karamilo, karamilo, alexi, karamilo et visiteur.
Le résultat de notre requête :
Autre possibilité qui, même si elle peut paraître évidente pour certains, ne l'est pas pour d'autres : on peut utiliser des fonctions à l'intérieur de COUNT. Par exemple avec un IF :
Code : SQL1 | SELECT COUNT(DISTINCT IF(nws_auteur='karamilo', 'Alexi Laiho', nws_auteur)) FROM t_news;
|
Notez enfin que la fonction COUNT()
ne prend pas en compte la valeur NULL. Ainsi, la requête suivante renverra 3 :
Code : SQL1 | SELECT COUNT(NULLIF(nws_auteur, 'karamilo')) FROM t_news;
|
NULLIF(a1, a2) renvoie NULL si a1 = a2, sinon elle renvoie a1.
COUNT et AVG ne prennent pas NULL en compte, mais bien les 0 !
C'est vrai également mais moins important pour les fonctions SUM, MIN et MAX.
On vient de voir de quoi il en retourne pour la fonction COUNT.
Pour la fonction AVG, c'est important également de le savoir puisque la valeur 0 influe très fortement une moyenne. Ainsi, si on veut la moyenne du nombre de vues par news sans compter les news où ce nombre vaut 0, la requête suivante ferait l'affaire :
Code : SQL1 | SELECT AVG(NULLIF(nws_nb_vues, 0)) FROM t_news;
|
COUNT(*) pour compter toutes les entrées de la table d'un coup
Code : SQL1 | SELECT COUNT(*) FROM t_news;
|
En général, l'étoile c'est mal, mais voici un des rare cas où... C'est bien.
En effet si vous utilisez COUNT(*) sur une table, MySQL ira chercher directement la valeur dans ses statistiques à lui et vous enverra ce nombre en un temps record : il ne devra pas parcourir toute la table.
Bien sûr, COUNT(DISTINCT *) ne rime à rien et vous renverra une erreur.
Enfin, à moins que toute la ligne ne soit NULL, COUNT(*) prend cette ligne en compte (vous pouvez vérifier avec la table
t_commentaire).
Hop ! Fin de la sous-partie.
C'était le plus simple

(à expliquer du moins

). Normalement vous commencez à comprendre pourquoi j'ai décidé de diviser ce chapitre en 2 parties.
