繁体   English   中英

SQL Server NULLABLE列与SQL COUNT()函数

[英]SQL Server NULLABLE column vs SQL COUNT() function

有人能帮我理解吗? 当我可以,我通常在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)

我可以计算NameNULL的记录数,如下所示:

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 WhyHow

那是因为

COUNT(column_name)函数返回指定列的值数(不计算NULL值)

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

所有内容都在COUNT(Transact-SQL)中描述

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

ALL - 是默认值

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

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

“COUNT()”不计算NULL值。 所以基本上:

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL

将返回行数(“ID”IS NOT NULL)AND(“Name”IS NULL); 结果是“1”

而:

SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL

将计算行数(“名称”不为空)和(“名称”为空); 结果将始终为0

如前所述, COUNT (column_name)不计算NULL值。 如果你不想使用COUNT(*)然后使用COUNT(1) ,但实际上你不会看到性能上的差异。

“总是避免使用*”是人们盲目追随的一揽子陈述之一。 如果你知道你为什么要避免*的原因那么你会知道在计数(*)时这些原因都不适用。

*COUNT(*)是不一样的*SELECT * FROM...

SELECT COUNT(*) FROM T; 非常具体地表示表格表达式T的基数。

SELECT COUNT(1) FROM T; 将生成与COUNT(*)相同的结果,但如果括号的内容不是*则必须解析它。

SELECT COUNT(c) FROM T; 其中c是表T的可空列,将计算非空值。

PS我在适当的情况下使用SELECT * FROM...很舒服。

PPS你的'表'没有键:考虑INSERT INTO Tbl VALUES ('John', 'John', 'John', NULL, NULL, NULL); 将被允许​​的结果将是无稽之谈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM