SQL Server NULLABLE column vs SQL COUNT()函数

SQL Server NULLABLE column vs SQL COUNT()函数,sql,sql-server,tsql,count,Sql,Sql Server,Tsql,Count,有人能帮我理解一下吗?如果可以,我通常在SQL语句中避免使用(*)。今天是回报。下面是一个场景: 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) 我可以计算Name为NULL的记录数,如下所示: SELEC

有人能帮我理解一下吗?如果可以,我通常在SQL语句中避免使用(*)。今天是回报。下面是一个场景:

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)
我可以计算
Name
NULL
的记录数,如下所示:

SELECT COUNT(*) FROM Tbl WHERE Name IS NULL
在避免(*)的同时,我发现以下两个语句给出了两个不同的结果:

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL
SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL
第一条语句正确返回1,而第二条语句生成0<代码>为什么或如何?

那是因为

COUNT(column\u name)
函数返回值的数目(NULL) 将不计算指定列的值)


因此,当您计算Id时,您会得到预期的结果,而计算名称“否”,但查询提供的答案是正确的

中描述了所有内容

ALL
-为默认值

COUNT(*)
返回组中的项目数。此包括空值和重复值


COUNT(ALL expression)
计算组中每一行的表达式,并返回非空值的数目

正如所说,
COUNT(列名)
不计算空值。 如果你不想使用
COUNT(*)
那么就使用
COUNT(1)
,但实际上你看不到性能上的差异。

“始终避免使用*”是人们盲目遵循的笼统说法之一。如果您知道避免*的原因,那么您就知道在执行count(*)时,这些原因都不适用。

“count()”不计算空值。所以基本上:

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL
将返回其中(“ID”不为空)和(“Name”为空)的行数;结果是“1”

而:

SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL

将计算其中的行(“名称”不为空)和(“名称”为空);结果总是0

计数(*)
中的
*
中的
*
不相同

从T中选择COUNT(*)
非常明确地表示表表达式的基数
T

从T中选择计数(1)
将生成与
COUNT(*)
相同的结果,但如果括号中的内容不是
*
,则必须对其进行分析

从T中选择计数(c)其中
c
是表
T
中可为空的列,将计算非空值

另外,在适当的情况下使用
SELECT*FROM…
,我感到很舒服


你的“表”没有键:考虑<代码>插入TBL值('约翰','约翰','约翰',NULL,NULL,NULL);<代码>将被允许,结果将是无意义的。

天哪!我该死!确实如此
SELECT COUNT(Name)FROM Tbl
仅返回不包含
NULL
的列数。该死!这意味着使用
(*)更安全
COUNT
函数中计算表中的记录-除非知道某个字段不可为空且永远不会为空,否则通常会从SQL SERVER收到警告
通过聚合或其他集合操作消除空值。
因为该问题通常会导致混淆。应避免
选择中的
*
*
,但您不应在
计数(*)
中避免
*
SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL