8.4.3.8 Compter les lignes

Les bases de données sont souvent utilisées pour répondre aux questions du type : ``combien de fois une information est-elle enregistrée dans une table?''. Par exemple, vous pouvez souhaiter connaître le nombre d'animaux que vous avez, ou le nombre d'animaux de chaque propriétaire, ou encore toutes sortes de statistiques sur les animaux.

Pour compter le nombre total d'animaux que vous avez, il suffit de compter le nombre de ligne dans la table animaux , puisqu'il y a un enregistrement par animal. La fonction COUNT() compte le nombre de ligne non-NULL. Votre requête ressemblera alors à :

mysql> SELECT COUNT(*) FROM animaux;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+

Précédemment, vous avez recherché les noms des propriétaires d'animaux. Vous pouvez utiliser la fonction COUNT() pour connaître le nombre d'animaux que chaque propriétaire a :

mysql> SELECT proprietaire, COUNT(*) FROM animaux GROUP BY proprietaire;
+---------------+----------+
| proprietaire  | COUNT(*) |
+---------------+----------+
| Benny         |        2 |
| Diane         |        2 |
| Gwen          |        3 |
| Harold        |        2 |
+---------------+----------+

Remarques: l'utilisation de la clause GROUP BY qui rassemble les lignes par proprietaire. Sans cette clause, vous obtenez le message d'erreur suivant :

mysql> SELECT proprietaire, COUNT(proprietaire) FROM animaux;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause

COUNT() et GROUP BY sont utiles pour caractériser vos informations dans de nombreuses situations : Les exemples suivant effectuent des statistiques sur vos animaux :

Nombre d'animaux par espèce

mysql> SELECT espece, COUNT(*) FROM animaux GROUP BY espece;
+----------+----------+
| espece   | COUNT(*) |
+----------+----------+
| oiseau   |        2 |
| chat     |        2 |
| chien    |        3 |
| hamster  |        1 |
| serpent  |        1 |
+----------+----------+

Nombre d'animaux par genre:

mysql> SELECT genre, COUNT(*) FROM animaux GROUP BY genre;
+-------+----------+
| genre | COUNT(*) |
+-------+----------+
| NULL  |        1 |
| f     |        4 |
| m     |        4 |
+-------+----------+

(Dans cette réponse, NULL indique ``genre inconnu.'')

Nombre d'animaux par espece et genre:

mysql> SELECT espece, genre, COUNT(*) FROM animaux GROUP BY espece, genre;
+---------+-------+----------+
| espece  | genre | COUNT(*) |
+---------+-------+----------+
| oiseau  | NULL  |        1 |
| oiseau  | f     |        1 |
| chat    | f     |        1 |
| chat    | m     |        1 |
| chien   | f     |        1 |
| chien   | m     |        2 |
| hamster | f     |        1 |
| serpent | m     |        1 |
+---------+-------+----------+

Il n'y a pas besoin d'utiliser la table entière avec la fonction COUNT(). Par exemple, la requête précédente effectuée sur la population de chien et de chat devient:

mysql> SELECT espece, genre, COUNT(*) FROM animaux
    -> WHERE espece = "chien" OR espece = "chat"
    -> GROUP BY espece, genre;
+---------+-------+----------+
| espece  | genre | COUNT(*) |
+---------+-------+----------+
| chat    | f     |        1 |
| chat    | m     |        1 |
| chien   | f     |        1 |
| chien   | m     |        2 |
+---------+-------+----------+

Ou, pour avoir le nombre d'animaux par genre, et pour les espèces connues :

mysql> SELECT espece, genre, COUNT(*) FROM animaux
    -> WHERE genre IS NOT NULL
    -> GROUP BY espece, genre;
+---------+-------+----------+
| espece  | genre | COUNT(*) |
+---------+-------+----------+
| oiseau  | f     |        1 |
| chat    | f     |        1 |
| chat    | m     |        1 |
| chien   | f     |        1 |
| chien   | m     |        2 |
| hamster | f     |        1 |
| serpent | m     |        1 |
+---------+-------+----------+