
La fonction SQL ORACLE COUNT sert à compter les lignes d’une table ou d’une requête.
SELECT COUNT(*) FROM EMP ; COUNT(*) ---------------------- 14
Cette fonction ne peut pas retourner une valeur nulle même si la requête ne retourne aucun résultat :
SELECT COUNT(*) FROM EMP WHERE 1 = 2 ; COUNT(*) ---------------------- 0
Nous pouvons aussi utiliser la fonction COUNT pour compter le nombre d’enregistrement non vide dans une colonne. Pour cela :
SELECT COUNT(COMM) FROM EMP ; COUNT(COMM) ---------------------- 4
Nous pouvons aussi sélectionner le nombre d’enregistrement distinct dans une colonne en utilisant :
SELECT COUNT(DISTINCT JOB) FROM EMP ; COUNT(DISTINCT JOB) ---------------------- 5
Nous utilisons DISTINCT pour ne comptabiliser (ou ne sélectionner, dans le cas d’un SELECT normal) qu’une seule fois les enregistrements en double.
Syntaxe de COUNT en SQL Oracle
COUNT(*) | COUNT([DISTINCT] expression)COUNT est une fonction d'agrégation : elle compte les lignes d'un résultat. Ses trois formes ne donnent pas le même résultat, et c'est la source d'erreur la plus fréquente.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
| Forme | Ce qui est compté | Compte les NULL ? |
|---|---|---|
| COUNT(*) | toutes les lignes | oui |
| COUNT(colonne) | lignes où la colonne n’est pas NULL | non |
| COUNT(DISTINCT col) | valeurs distinctes non NULL | non |
SELECT COUNT(*) FROM employes; -- 14
SELECT COUNT(commission) FROM employes; -- 4 (10 NULL ignorés)
SELECT COUNT(DISTINCT departement) FROM employes; -- 3COUNT avec GROUP BY
SELECT departement, COUNT(*) AS effectif
FROM employes
GROUP BY departement
ORDER BY effectif DESC;COUNT avec HAVING : filtrer sur le comptage
On ne peut pas filtrer une fonction d’agrégation dans WHERE — il faut HAVING :
SELECT departement, COUNT(*) AS effectif
FROM employes
GROUP BY departement
HAVING COUNT(*) > 5;Compter conditionnellement
Astuce très utilisée : combiner COUNT et CASE (ou DECODE) pour compter selon un critère, en une seule passe :
SELECT COUNT(*) AS total,
COUNT(CASE WHEN salaire > 3000 THEN 1 END) AS bien_payes,
SUM(DECODE(sexe, 'F', 1, 0)) AS femmes
FROM employes;COUNT(*) vs COUNT(1) : le mythe des performances
On lit souvent que COUNT(1) serait plus rapide que COUNT(*). C’est faux depuis longtemps : l’optimiseur Oracle traite les deux formes de façon identique. Utilisez COUNT(*), c’est la forme standard et la plus lisible.
En revanche, sur de très grosses tables, COUNT(*) reste coûteux car il parcourt tout. Si un index existe sur une colonne NOT NULL, Oracle l’utilisera automatiquement (index fast full scan), ce qui est bien plus rapide qu’un full table scan.
