3 votes

Colonne NULLABLE de SQL Server vs fonction COUNT() de SQL

Quelqu'un peut-il m'aider à comprendre quelque chose ? Lorsque je le peux, j'évite généralement les (*) dans une instruction SQL. Aujourd'hui, c'est la revanche. Voici un scénario :

CREATE TABLE Tbl (Id INT IDENTITY(1, 1) PRIMARY KEY, Name NVARCHAR(16))

INSERT INTO Tbl VALUES (N'John')
INSERT INTO Tbl VALUES (N'Brett')
INSERT INTO Tbl VALUES (NULL)

Je pourrais compter le nombre d'enregistrements où Name es NULL comme suit :

SELECT COUNT(*) FROM Tbl WHERE Name IS NULL

Tout en évitant le (*), j'ai découvert que les deux déclarations suivantes me donnaient deux résultats différents :

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL
SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL

La première déclaration renvoie correctement 1 tandis que la seconde déclaration donne 0 . Why ou How ?

5voto

Marco Points 29879

C'est parce que

En COUNT(column_name) renvoie le nombre de les valeurs NULL ne seront pas comptées) de la colonne spécifiée

Ainsi, lorsque vous comptez Id, vous obtenez le résultat attendu, alors que lorsque vous comptez Nom, vous n'obtenez pas le résultat attendu, mais la réponse fournie par la requête est correcte.

1voto

Michał Powaga Points 8949

Tout est décrit dans COUNT (Transact-SQL) .

COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

ALL - est par défaut

COUNT(*) renvoie le nombre d'éléments d'un groupe. Il s'agit d'un inclut les valeurs NULL et les doublons.

COUNT(ALL expression) évalue l'expression pour chaque ligne d'un groupe et renvoie le nombre de valeurs non nulles .

1voto

Andy Points 1640

"COUNT()" ne compte pas les valeurs NULL. Donc, en gros :

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL

renvoie le nombre de lignes où ("ID" N'EST PAS NULL) ET ("Nom" N'EST PAS NULL) ; le résultat est "1"

Tandis que :

SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL

comptera les lignes où ("Nom" N'EST PAS NULL) ET ("Nom" EST NULL) ; le résultat sera toujours 0

0voto

Igor Borisenko Points 3656

Comme il a été dit, COUNT (column_name) ne compte pas les valeurs NULL. Si vous ne voulez pas utiliser COUNT(*) puis utiliser COUNT(1) mais en réalité, vous ne verrez pas de différence de performance.

0voto

Brandon Moore Points 3772

"Évitez toujours d'utiliser *" est l'une de ces affirmations générales que les gens suivent aveuglément. Si vous connaissiez les raisons pour lesquelles vous évitez *, vous sauriez qu'aucune de ces raisons ne s'applique à l'utilisation de count(*).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X