J'ai la requête suivante:
select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;
Quelle serait la différence si je remplaçais tous les appels count(column_name)
vers count(*)
?
Cette question a été inspirée par Comment trouver des valeurs en double dans une table dans Oracle? .
Pour clarifier la réponse acceptée (et peut-être ma question), le remplacer count(column_name)
par count(*)
retournerait une ligne supplémentaire dans le résultat qui contient a null
et le nombre de null
valeurs dans la colonne.
Une autre différence mineure, entre l'utilisation de * et une colonne spécifique, est que dans le cas de la colonne, vous pouvez ajouter le mot clé DISTINCT et restreindre le nombre à des valeurs distinctes:
la source
Une autre différence, peut-être subtile, est que dans certaines implémentations de base de données, le nombre (*) est calculé en regardant les index sur la table en question plutôt que les lignes de données réelles. Puisqu'aucune colonne spécifique n'est spécifiée, il n'est pas nécessaire de se préoccuper des lignes réelles et de leurs valeurs (comme ce serait le cas si vous comptiez une colonne spécifique). Autoriser la base de données à utiliser les données d'index peut être beaucoup plus rapide que de lui faire compter des lignes "réelles".
la source
L'explication dans la documentation , aide à expliquer ceci:
Donc, count (*) inclut des valeurs nulles, l'autre méthode ne le fait pas.
la source
Nous pouvons utiliser l' explorateur de données Exchange Stack pour illustrer la différence avec une simple requête. La table Utilisateurs de la base de données de Stack Overflow contient des colonnes qui sont souvent laissées vides, comme l'URL du site Web de l'utilisateur.
Si vous exécutez la requête ci-dessus dans l' explorateur de données , vous verrez que le nombre est le même pour
count(Id)
etcount(*)
parce que laId
colonne n'autorise pas lesnull
valeurs. LeWebsiteUrl
nombre est cependant beaucoup plus faible, car cette colonne le permetnull
.la source
Fondamentalement, la
COUNT(*)
fonction renvoie toutes les lignes d'une table alors que ceCOUNT(COLUMN_NAME)
n'est pas le cas; c'est-à-dire qu'il exclut les valeurs nulles auxquelles tout le monde ici a également répondu ici. Mais la partie la plus intéressante est de rendre les requêtes et la base de données optimisées, il est préférable de les utiliser àCOUNT(*)
moins de faire plusieurs comptes ou une requête complexe plutôt queCOUNT(COLUMN_NAME)
. Sinon, cela réduira vraiment les performances de votre base de données tout en traitant un grand nombre de données.la source
Veuillez consulter le code suivant pour les exécutions de test SQL Server 2008:
la source
COUNT(*)
- Renvoie le nombre total d'enregistrements dans une table (y compris les enregistrements de valeur NULL).COUNT(Column Name)
- Renvoie le nombre total d'enregistrements non NULL. Cela signifie que, il ignore le comptage des enregistrements de valeur NULL dans cette colonne particulière.la source
Il est préférable d'utiliser
pour compter le nombre de lignes dans une table, c'est plus rapide que n'importe quel format car il ne va jamais vérifier que le nom de la colonne dans la table existe ou non
la source
COUNT(*)
en comparaison avecCOUNT(columnName)
ne va pas vérifier la valeur des colonnes, car il énumère simplement les lignes. MaisCOUNT(columnName)
est plus lent, mêmecount
appliqué sur uneid
colonne! Au moins dans SQL Server, bien sûr.Il n'y a pas de différence si une colonne est fixe dans votre table, si vous souhaitez utiliser plus d'une colonne que vous devez spécifier le nombre de colonnes dont vous avez besoin pour compter ......
Merci,
la source
Comme mentionné dans les réponses précédentes,
Count(*)
compte même lesNULL
colonnes, alors qu'ilcount(Columnname)
ne compte que si la colonne a des valeurs.Il est toujours préférable d'éviter tout
*
(Select *
,count *
, ...)la source
COUNT(*)