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
他们返回1
和0
:
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) 为组中的每一行计算表达式,并返回非空值的数量。
因此,它们被评估,它们返回NULL
s 并且由于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
?
当在表达式中指定常量时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;
到脚本的开头。