web-dev-qa-db-fra.com

count (*) vs count (nom_colonne) - lequel est le plus correct?

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

J'ai tendance à toujours écrire count(*) parce que cela me semble mieux correspondre à la notion de fonction agrégée, si cela a du sens.

Mais je ne suis pas sûr que ce soit techniquement meilleur car j'ai tendance à voir un exemple de code écrit sans le * plus souvent qu'autrement.

nombre (*):

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

vs. count (nom_colonne):

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

Votre utilisation de COUNT(*) ou COUNT(column) doit être basée sur la sortie souhaitée uniquement .

128
gbn

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

La différence est:

  • COUNT(*) comptera le nombre d'enregistrements.
  • COUNT(column_name) comptera le nombre d'enregistrements pour lesquels nom_colonne n'est pas nul.

Par conséquent, COUNT(*) est ce que vous devez utiliser. Si vous utilisez MyISAM et qu'il n'y a pas de clause WHERE, l'optimiseur n'a même pas à consulter la table, car le nombre de lignes est déjà mis en cache.

32
nickf

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

Cependant, il y a is une différence entre COUNT(*) et COUNT(column) en général, en ce que COUNT(column) retournera un nombre de non NULL valeurs dans la colonne. Il existe également la variante COUNT(DISTINCT column) qui renvoie le nombre de valeurs uniques non NULL.

17
Dean Harding

Oui, il y a une différence de performance possible. En fonction de votre requête et de l'indexation de la table en question, il peut être plus rapide d'obtenir le nombre à partir de l'index au lieu d'utiliser table pour les données. Ainsi, vous devriez probablement spécifier le nom du champ au lieu d'utiliser *.

5
Tommi

Généralement, c'est la même chose, mais dans les détails, autant que je sache "nombre (*)" est meilleur b/c "nombre (nom de colonne)" force DB à s'exécuter un peu plus de code pour rechercher ce nom de colonne (mais pas nécessaire cependant).

5
zed_0xff