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

标签 sql sql-server tsql group-by count

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

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

1/0
1/'A'
1/NULL
NULL/1

但包裹在COUNT他们返回 10 :
SELECT COUNT(1/0);    -- 1
SELECT COUNT(1/'A');  -- 1
SELECT COUNT(1/NULL); -- 0
SELECT COUNT(NULL/1); -- 0
NULL案例可以由文档解释为

COUNT(ALL expression) evaluates expression for each row in a group, and returns the number of nonnull values.



因此,评估后,它们返回 NULL s 和 as 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;

(1 row affected) Msg 8134, Level 16, State 1, Line 16 Divide by zero error encountered.

Completion time: 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" />

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

关于sql - 解释不带组使用时的 COUNT 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60798939/

相关文章:

mysql - 如何从子查询中获取具体行来比较主查询中的值?

sql - 打印当前月份的行,然后是一年中剩余的月份

sql - 从脚本中获取 sql 日志文件名

sql-server-2008 - 安全删除 sqlserver 中的行,以便您可以回滚提交

sql - 在 Sql-Server 中按月份名称排序

c# - SQL Select - 作为一个返回

SQL Server 日期范围

sql - MySQL:在 CREATE TABLE 语句中命名主键

sql - 如果值可以转换为 INT,我如何强制 SQL 仅评估连接?

sql-server - 使用 EF Core 插入 SQL Server 时出现事务死锁