解释不带组使用时的 COUNT 返回值

got*_*tqn 5 sql t-sql sql-server group-by count

COUNT返回在组中找到的项目数,默认情况下它包括 NULL 值和重复项。

前两条语句返回错误,后两条语句返回 - NULL

1/0
1/'A'
1/NULL
NULL/1
Run Code Online (Sandbox Code Playgroud)

但包裹在COUNT他们返回10

SELECT COUNT(1/0);    -- 1
SELECT COUNT(1/'A');  -- 1
SELECT COUNT(1/NULL); -- 0
SELECT COUNT(NULL/1); -- 0
Run Code Online (Sandbox Code Playgroud)

这些NULL案例可以由文档解释为

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

因此,它们被评估,它们返回NULLs 并且由于non null值只是计数,我们得到0

我想知道为什么前两个返回1

将值放在表中,一切似乎都很正常 - 抛出错误并且不返回任何值:

DECLARE @DataSource TABLE
(
    [valueA] INT
   ,[valueB] INT
);

INSERT INTO @DataSource ([valueA],[valueB])
VALUES (1, 0);

SELECT COUNT([valueA]/[valueB])
FROM @DataSource;
Run Code Online (Sandbox Code Playgroud)

(受影响的 1 行)消息 8134,级别 16,状态 1,第 16 行遇到除以零错误。

完成时间:2020-03-22T13:47:44.5512536+02:00

也许这1 row affected被返回为COUNT

Dan*_*man 4

当在表达式中指定常量时COUNT,SQL Server 可以在编译时优化查询,避免在执行时计算表达式。结果值永远不会出现NULL在前 2 个查询中,而始终出现NULL在最后 2 个查询中。

SELECT COUNT(1/0)以下是执行计划的片段SELECT COUNT(1/NULL)

<ScalarOperator ScalarString="Count(*)">
<Const ConstValue="NULL" />
Run Code Online (Sandbox Code Playgroud)

客户端工具 (SSMS) 生成的“1 行受影响”消息,反映了语句返回的行计数INSERT。如果不需要,请添加SET NOCOUNT ON;到脚本的开头。