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.

183
sql
demandé sur Community 2008-09-12 19:27:17

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

217
répondu SQLMenace 2011-09-11 12:50:35

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;
33
répondu Brannon 2008-09-12 22:32:12

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".

12
répondu Alan 2008-09-14 03:13:10

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.

9
répondu Peter C 2015-11-13 16:47:46

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.

9
répondu Bill the Lizard 2017-08-29 13:14:45

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.

2
répondu Ahmedul Kabir 2013-05-04 20:47:38
  • 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
1
répondu G21 2012-02-16 19:58:27

, 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

0
répondu Ali Adravi 2012-06-07 19:50:14

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,

0
répondu Hiren gardhariya 2012-10-29 04:44:31

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 *, ...)

0
répondu Unna 2016-05-02 17:05:59