SQL Server NULLABLE column vs SQL COUNT()函数
有人能帮我理解一下吗?如果可以,我通常在SQL语句中避免使用(*)。今天是回报。下面是一个场景: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
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