En SQL, Quelle est la différence entre count (column) et count (*)?
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 j'ai remplacé tous les appels à count(column_name)
à 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), remplacer count(column_name)
par {[2] } renverrait une ligne supplémentaire dans le résultat qui contient un null
et le nombre de valeurs null
dans la colonne.
10 réponses
count(*)
compte NULLs et count(column)
ne fait pas
[edit] a ajouté ce code pour que les gens puissent l'exécuter
create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)
select count(*),count(id),count(id2)
from #bla
Résultats 7 3 2
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 limiter le nombre à des valeurs distinctes:
select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;
Une autre différence peut-être subtile est que dans certaines implémentations de base de données, Le count (*) est calculé en regardant les index de la table en question plutôt que les lignes de données réelles. Comme aucune colonne spécifique n'est spécifiée, il n'est pas nécessaire de s'embêter avec les lignes réelles et leurs valeurs (comme il y en aurait si vous comptiez une colonne spécifique). Permettre à la base de données d'utiliser les données d'index peut être beaucoup plus rapide que de le faire compter des lignes "réelles".
L'explication dans les documents , aide à expliquer ceci:
COUNT(*) renvoie le nombre d'éléments d'un groupe, y compris les valeurs nulles et les doublons.
COUNT (expression) évalue l'expression pour chaque ligne d'un groupe et renvoie le nombre de valeurs nonnull.
Donc count(*) inclut des valeurs NULL, l'autre méthode ne le fait pas.
Nous pouvons utiliser le Stack Exchange Data Explorer pour illustrer la différence avec une requête simple. La table Users dans la base de données Stack Overflow a des colonnes qui sont souvent laissées vides, comme L'URL du site Web de l'utilisateur.
-- count(column_name) vs. count(*)
-- Illustrates the difference between counting a column
-- that can hold null values, a 'not null' column, and count(*)
select count(WebsiteUrl), count(Id), count(*) from Users
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)
et count(*)
car la colonne Id
n'autorise pas les valeurs null
. Le nombre de WebsiteUrl
est cependant beaucoup plus faible, car cette colonne autorise null
.
Fondamentalement, la fonction COUNT (*) renvoie toutes les lignes d'une table alors que COUNT (COLUMN_NAME) ne le fait pas; c'est-à-dire qu'elle 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 d'utiliser COUNT(*) à moins de faire plusieurs comptes ou une requête complexe plutôt que COUNT(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 phrase COUNT(*) indique à SQL Server de renvoyer toutes les lignes d'une table, y compris les valeurs Null.
- COUNT (column_name) récupère simplement les lignes ayant une valeur non nulle sur les lignes.
Veuillez consulter le code suivant pour les exécutions de test SQL Server 2008:
-- Variable table
DECLARE @Table TABLE
(
CustomerId int NULL
, Name nvarchar(50) NULL
)
-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, 'Pedro')
INSERT INTO @Table VALUES( 1, 'Juan')
INSERT INTO @Table VALUES( 2, 'Pablo')
INSERT INTO @Table VALUES( 3, 'Marcelo')
INSERT INTO @Table VALUES( NULL, 'Leonardo')
INSERT INTO @Table VALUES( 4, 'Ignacio')
-- Get all the collumns by indicating *
SELECT COUNT(*) AS 'AllRowsCount'
FROM @Table
-- Get only content columns ( exluce NULLs )
SELECT COUNT(CustomerId) AS 'OnlyNotNullCounts'
FROM @Table
, Il est préférable d'utiliser
Count(1) in place of column name or *
Pour compter le nombre de lignes dans une table, il est plus rapide que n'importe quel format car il ne vérifie jamais le nom de la colonne dans la table existe ou non
Il N'y a pas de différence si une colonne est corrigée dans votre table, si vous voulez utiliser plus d'une colonne que vous devez spécifier combien de colonnes vous devez compter......
Merci,
Comme mentionné dans les réponses précédentes, Count(*)
compte même les colonnes NULL
, alors que count(Columnname)
ne compte que si la colonne a des valeurs.
, Il est toujours une bonne pratique pour éviter *
(Select *
, count *
, ...)