代码之家  ›  专栏  ›  技术社区  ›  Ali

count(*)总是返回结果吗?

  •  32
  • Ali  · 技术社区  · 15 年前

    如果我运行以下查询:

    SELECT COUNT(*) as num FROM table WHERE x = 'y'
    

    即使查询与任何记录都不匹配,它是否始终返回结果?还是需要验证并确保返回一行作为结果?

    7 回复  |  直到 10 年前
        1
  •  46
  •   gbn    11 年前

    是的,因为它是一个聚合并返回零。 除非你添加组,在这种情况下没有结果,因为没有组…

    max/sum etc将返回空值,除非在没有行之前添加group。 只有count返回一个没有结果的数字

    编辑,稍晚:sum将像max一样返回null

    2013年5月编辑:这适用于所有主要RDBMS。我想是按照美国国家标准协会的标准

        2
  •  8
  •   Triynko    13 年前

    是的, “count”函数本身的返回值 总是一个非空整数,没有例外。

    话虽如此,你可能更感兴趣的回报价值 查询 ,实际上是 结果集 . 如果是这样,那么您只需考虑查询是否包含“group by”子句。

    非分组查询 聚合函数如下

    select count(*), sum(*), max(*), min(*) from table
    

    生成包含单个记录的结果集 包含聚合函数的返回值。在这种情况下,结果集将始终只有一条记录,其中的列包含所包含的任何聚合函数的返回值。在这个单独的记录中,count的返回值将始终是非空整数,而其他聚合函数(如min、max和sum)的返回值可能为空。在上面的例子中,您返回的记录可能是“0,null,null,null”,但是永远不会是“null,null,null,null”,因为count永远不会返回null。因此,如果只调用“count”,那么返回的记录中的一列将始终包含count的非空返回值;因此,您可以放心,count查询的标量返回值将始终是非空整数。

    另一方面,一个 分组查询 聚合函数如下

    select count(*), sum(*), max(*), min(*) from table group by column
    

    生成包含零个或多个记录的结果集 哪里 每条记录 包含所标识的每个组的聚合函数的返回值。在这种情况下,如果没有标识组,则聚合函数没有可运行的组,函数永远不会运行,“查询返回值”将是一个完全没有记录的空集。

    在一张没有记录的桌子上测试,看看结果:

    create table #t (c int);
    select COUNT(c), MIN(c), MAX(c), SUM(c) from #t; --returns one record {0, null, null, null}
    select COUNT(c), MIN(c), MAX(c), SUM(c) from #t group by c; --returns no records
    drop table #t;
    

    因此,无论您是调用count、min、max还是sum,不仅要了解单个聚合函数的返回值,还要了解查询本身的“返回值”,以及结果集包含的内容。

        3
  •  5
  •   Axarydax    15 年前

    聚合函数count()始终返回值

        4
  •  2
  •   Midhat    15 年前

    是的,它将始终返回一个数字

        5
  •  2
  •   reko_t    15 年前

    是的,在这种情况下会返回0。

        6
  •  2
  •   mauris    15 年前

    总会有这样一行结果:

    | COUNT(*) |
    ------------
    | 0        |
    

    如果没有匹配项。

    顺便说一下,我宁愿只计算主键而不是 * .

        7
  •  2
  •   Omry Yadan    15 年前

    如果没有匹配的记录,则计数将返回0。 (所以是的,count总是返回一个结果,除非您有语法错误)