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;
COUNT(*)
compte toutes les lignesCOUNT(column)
ne compte que les non-NULLCOUNT(1)
est identique à COUNT(*)
car 1 est une expression non nulleVotre utilisation de COUNT(*)
ou COUNT(column)
doit être basée sur la sortie souhaitée uniquement .
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.
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
.
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 *.
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).