count (*) vs count (nom-colonne) – qui est plus correct?

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

J’ai tendance à toujours écrire count(*) car 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 le meilleur car j’ai tendance à voir des exemples de code écrits sans le * plus souvent qu’autrement.

compter(*):

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

vs nombre (nom-colonne):

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

  • COUNT(*) compte toutes les lignes.
  • COUNT(column) compte que les non-NULL
  • COUNT(1) est identique à COUNT(*) car 1 est une expression non nulle

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

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 où 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 besoin de regarder la table, car le nombre de lignes est déjà en cache.

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

Cependant, il existe une différence entre COUNT(*) et COUNT(column) en général, dans laquelle COUNT(column) renverra un décompte des valeurs non NULL dans la colonne. Il existe également la variante COUNT(DISTINCT column) qui renvoie le nombre de valeurs uniques non NULL .

Généralement, c’est la même chose, mais dans les détails, AFAIK “count (*)” vaut mieux b / c “count (columnname)” oblige la firebase database à exécuter un peu plus de code pour rechercher ce nom de colonne

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’aller à la table pour les données. Ainsi, vous devriez probablement spécifier le nom du champ, au lieu d’utiliser *.