La fonction COUNT() est l'une des fonctions d'agrégation les plus populaires et utiles en SQL. Son but principal — compter le nombre de lignes dans les résultats d'une requête. Si la fonction COUNT() était un super-héros dans le monde SQL, son super-pouvoir serait de trouver rapidement des réponses à des questions comme :
- Combien d'employés bossent dans la boîte ?
- Combien d'étudiants sont inscrits dans chaque faculté ?
- Combien de produits ont été vendus le mois dernier ?
La syntaxe de COUNT() est plutôt simple :
COUNT(colonne)
où colonne — c'est le nom de la colonne dont tu veux compter les lignes. Mais il y a d'autres façons de l'utiliser, qu'on va voir plus loin dans la leçon.
Allez, on commence par l'utilisation la plus basique de COUNT().
Variante 1 : Compter toutes les lignes avec COUNT(*)
Quand tu veux compter chaque ligne dans une table, peu importe si elles ont des données ou pas, tu utilises COUNT(*). L'étoile veut dire « toutes les colonnes ».
Exemple : On a une table students avec ce contenu :
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
On lance la requête suivante :
SELECT COUNT(*)
FROM students;
Résultat :
| count |
|---|
| 4 |
La fonction COUNT(*) ne fait pas attention aux valeurs NULL dans les colonnes individuelles, parce qu'elle compte juste le nombre de lignes dans la table.
Variante 2 : Compter les lignes avec des valeurs existantes dans une colonne COUNT(colonne)
Mais si tu veux compter seulement les lignes où il y a une valeur non-NULL dans une colonne précise ? Là, tu utilises COUNT(colonne).
Exemple : on va compter le nombre d'étudiants qui ont un nom renseigné.
SELECT COUNT(name)
FROM students;
Résultat :
| count |
|---|
| 3 |
T'as vu la différence ? Il y a 4 lignes dans la table, mais dans l'une d'elles la colonne name contient NULL. La fonction COUNT(colonne) ignore les lignes où la valeur de la colonne est NULL.
Comparer COUNT(*) et COUNT(colonne)
Alors, c'est quoi la vraie différence entre ces deux façons d'utiliser la fonction : COUNT(*) et COUNT(colonne) ?
COUNT(*)compte toutes les lignes dans la table, même celles avecNULLdans n'importe quelle colonne.COUNT(colonne)compte seulement les lignes où la colonne indiquée a une valeur différente de NULL.
Table d'exemple :
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Requêtes :
-- Compte toutes les lignes.
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (toutes les lignes)
-- Compte seulement les lignes où le nom n'est pas NULL.
SELECT COUNT(name) FROM students; -- 3 -- On compte les lignes avec un nom renseigné
-- Compte seulement les lignes où l'âge n'est pas NULL.
SELECT COUNT(age) FROM students; -- 3 -- On compte les lignes avec un âge renseigné
Variante 3 : Compter les valeurs uniques avec COUNT(DISTINCT colonne)
Parfois, tu veux compter seulement les valeurs uniques dans une colonne. Par exemple, on veut savoir combien d'âges différents sont renseignés pour les étudiants. Là, COUNT(DISTINCT colonne) est ton pote.
Exemple :
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
Résultat :
| count |
|---|
| 3 |
Fais gaffe, ici DISTINCT ignore non seulement les doublons, mais aussi les valeurs NULL.
Si tu essaies d'utiliser DISTINCT avec COUNT(*), tu vas avoir une erreur : DISTINCT ne marche que sur des colonnes précises.
Exemples d'utilisation de COUNT() dans des cas réels
Exemple 1. Compter le nombre d'étudiants
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
Résultat :
| total_students |
|---|
| 4 |
Exemple 2. Compter les étudiants avec un âge connu
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
Résultat :
| students_with_age |
|---|
| 3 |
Exemple 3. Compter les âges uniques
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
Résultat :
| unique_ages |
|---|
| 2 |
Erreurs classiques quand tu utilises COUNT()
Penser que COUNT(colonne) va compter toutes les lignes, même si y'a des NULL.
C'est faux : COUNT(colonne) ignore les lignes où la colonne est NULL.
Utiliser COUNT(*) pour compter les valeurs uniques.
À la place, utilise COUNT(DISTINCT colonne).
Oublier de filtrer quand tu comptes des données précises.
Par exemple :
SELECT COUNT(*) FROM students WHERE age > 20;
Là, tu vas avoir seulement les étudiants de plus de 20 ans, et WHERE filtre déjà les lignes avant de compter.
Ces petits détails causent souvent des bugs logiques dans les requêtes. Fais gaffe !
GO TO FULL VERSION