【问题标题】:What is the difference between count(0), count(1).. and count(*) in mySQL/SQL?mySQL/SQL 中的 count(0)、count(1).. 和 count(*) 有什么区别?
【发布时间】:2013-08-17 16:33:48
【问题描述】:

我最近在一次采访中被问到这个问题。 我在 mySQL 中尝试了这个,并得到了相同的结果(最终结果)。 All 给出了该特定表中的行数。 谁能解释它们之间的主要区别。

【问题讨论】:

标签: mysql sql


【解决方案1】:

没什么,除非你在表格中指定一个字段或在括号中指定一个表达式,而不是常量值或 *

让我给你一个详细的答案。 Count 将为您提供给定字段的非空记录号。假设您有一个名为 A 的表

select 1 from A
select 0 from A
select * from A

都将返回相同数量的记录,即表 A 中的行数。但输出仍然不同。如果表中有 3 条记录。以 X 和 Y 作为字段名

select 1 from A will give you

1
1
1

select 0 from A will give you
0
0
0

select * from A will give you ( assume two columns X and Y is in the table )
X      Y
--     --
value1 value1
value2 (null)
value3 (null)

因此,所有三个查询都返回相同的数字。除非你使用

select count(Y) from A 

因为只有一个非空值,你会得到 1 作为输出

【讨论】:

  • 那么为什么将整数值传递给 count 函数呢?
  • @DhruvSingh 在我的回答中为您提供了更多详细信息
  • @Felipe Correa 考虑到 Oracle 并没有真正的性能差异,如果您获得执行计划,您将看到 Oracle 以相同的方式运行。正如 eftpotrm 在他的回答中所说,在过去它可能不一样,而 count(1) 或 count(0) 会更可取。但现在我怀疑它在任何 rdbms 系统中都会有所不同。
  • 尚不清楚如果A.X 将是NULL,其中A.YNULL,那么重要的是什么。
【解决方案2】:

COUNT(*) 将计算行数,而COUNT(expression) 将计算表达式中的非空值,COUNT(column) 将计算列中的所有非空值。

由于 0 和 1 都是非空值,COUNT(0)=COUNT(1) 和它们都将等于行数COUNT(*)。这是一个不同的概念,但结果是一样的。

【讨论】:

  • 谢谢 fthiella。 @brhneser 为像我这样的初学者提供了非常详细的答案。
  • 是的,你是对的,但我认为count(*) 会比count(1) 花费更长的时间,不是吗?如果是,那么使用count(1) 会更好地提高性能。 :)
  • @Yubaraj count(1) 曾经比 count() 有更好的性能,至少在某些 dbms 上是这样,但现在优化器能够使 count() 等同于计数(1)
【解决方案3】:

现在 - 它们的性能应该相同。

然而,在过去的日子里,有时建议使用 COUNT(1)(或您选择的任何常量)而不是 COUNT(*),因为糟糕的查询优化代码会使数据库在运行计数之前检索所有字段数据。因此 COUNT(1) 更快,但现在应该没关系了。

【讨论】:

    【解决方案4】:

    由于表达式1 是一个常量表达式,它们应该始终产生相同的结果,但实现可能会有所不同,因为某些RDBMS 可能会检查组中的每一行是否有1 IS NULLThis is still being done by PostgreSQL 11.3 as I have shown in this article.

    我已经对 1M 行的查询进行了基准测试,并进行了两种类型的计数:

    -- Faster
    SELECT count(*) FROM t;
    
    -- 10% slower on PostgreSQL 11.3
    SELECT count(1) FROM t;
    

    人们可能会使用不太直观的COUNT(1) 的一个原因可能是从历史上看,情况正好相反。

    【讨论】:

      【解决方案5】:

      结果将是相同的,但是COUNT(*) 在今天的许多生产环境中速度较慢,因为在生产环境中数据库引擎可以存活数十年。我更喜欢使用COUNT(0),有人使用COUNT(1),但绝对不是COUNT(*),即使可以说可以安全地在现代数据库引擎上使用,我也不会依赖引擎,特别是如果它只有一个字符差异,也代码将更具可移植性。

      【讨论】:

        【解决方案6】:
        1. count(any integer value) 比 count(*) 快 ---> 给出包括空值在内的所有计数

        2. count(column_name) 省略 null

        前-->

        列名=> id

        值 => 1 1 null null 2 2

        ==> count(0), count(1), count(*) -----> 结果只有 6 个

        ==> count(id) ----> 结果是 4

        【讨论】:

          【解决方案7】:

          假设我们有一个带有列的表格

          Table 
          -------
          col_A  col_B
          

          查询时系统返回所有列(空和非空)值

          select col_A from Table
          

          查询时系统返回非空的列值

          select count(col_A) from Table
          

          查询时系统返回总行数

          select count(*) from Table
          

          【讨论】:

            【解决方案8】:

            Mysql5.6 ?

            InnoDB 以相同的方式处理 SELECT COUNT(*) 和 SELECT COUNT(1) 操作。没有性能差异。

            12.19.1 Aggregate Function Descriptions

            官方文档是我找到许多不同答案后最快的方法。

            【讨论】:

              【解决方案9】:
              COUNT(*), COUNT(1) , COUNT(0), COUNT('Y') , ...
              

              以上所有都返回记录总数(包括空记录)。

              但是COUNT('any constant')COUNT(*) 快。

              【讨论】:

                猜你喜欢
                • 2015-03-03
                • 2010-09-08
                • 2011-02-22
                • 2020-03-02
                • 2020-11-10
                • 2010-09-08
                • 1970-01-01
                • 2014-06-09
                相关资源
                最近更新 更多