152 votes

count(*) vs count(nom-de-colonne) - lequel est le plus correct ?

Cela fait-il une différence que vous fassiez count(*) vs count(column-name) comme dans ces deux exemples ?

J'ai tendance à toujours écrire count(*) parce qu'elle me semble mieux correspondre à l'idée qu'il s'agit d'une fonction agrégée, si cela a un sens.

Mais je ne suis pas sûr que ce soit techniquement la meilleure solution, car j'ai tendance à voir des exemples de code écrits sans l'option * le plus souvent.

count(*) :

select customerid, count(*), sum(price) 
from items_ordered
group by customerid
having count(*) > 1;

vs. count(nom-de-la-colonne) :

SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;

204voto

gbn Points 197263

Votre utilisation de COUNT(*) o COUNT(column) doit être basée sur le résultat souhaité seulement .

46voto

nickf Points 185423

Ceci s'applique à MySQL. Je ne suis pas sûr pour les autres.

La différence est la suivante :

  • COUNT(*) comptera le nombre d'enregistrements.
  • COUNT(column_name) comptera le nombre d'enregistrements pour lesquels le nom de la colonne n'est pas nul.

C'est pourquoi COUNT(*) est ce que vous devez utiliser. Si vous utilisez MyISAM et qu'il n'y a pas de WHERE l'optimiseur n'a même pas besoin de regarder la table, puisque le nombre de lignes est déjà mis en cache.

24voto

Dean Harding Points 40164

Lorsqu'il s'agit d'un identifiant (et qu'il est garanti qu'il est non NULL ), cela n'a probablement pas d'importance.

Cependant, il y a est une différence entre COUNT(*) y COUNT(column) en général, en ce sens que COUNT(column) renverra un décompte de la valeur de l'élément non NULL dans la colonne. Il existe également la fonction COUNT(DISTINCT column) variante qui renvoie le nombre d'objets uniques, non NULL valeurs.

6voto

Tommi Points 5707

Oui, il peut y avoir une différence de performance. En fonction de votre requête et de l'indexation de la table en question, il peut être plus rapide d'obtenir le décompte à partir de l'index plutôt que d'aller chercher les données dans la table. Vous devriez donc probablement spécifier le nom du champ, au lieu d'utiliser *.

6voto

zed_0xff Points 12379

En général, c'est la même chose, mais dans les détails AFAIK "count(*)" est préférable b/c "count(columnname)" oblige la DB à exécuter un peu plus de code pour rechercher le nom de la colonne (mais ce n'est pas nécessaire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X