Fonction SQL ORACLE – COUNT()

Illustration du tutoriel SQL Oracle : Fonction SQL ORACLE – COUNT()

La fonction SQL ORACLE COUNT sert à compter les lignes d’une table ou d’une requête.

Publicité
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.

FormeCe qui est comptéCompte les NULL ?
COUNT(*)toutes les lignesoui
COUNT(colonne)lignes où la colonne n’est pas NULLnon
COUNT(DISTINCT col)valeurs distinctes non NULLnon
SELECT COUNT(*)                  FROM employes;  -- 14
SELECT COUNT(commission)         FROM employes;  -- 4  (10 NULL ignorés)
SELECT COUNT(DISTINCT departement) FROM employes; -- 3

COUNT 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.

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Cours SQL & Oracle — 100% gratuitVoir les cours →