【问题标题】:Different faces of COUNTCOUNT 的不同面孔
【发布时间】:2010-09-07 05:06:02
【问题描述】:

我想知道以下 4 个简单查询在结果和功能方面的区别:

  1. SELECT COUNT(*) FROM employees;

  2. SELECT COUNT(0) FROM employees;

  3. SELECT COUNT(1) FROM employees;

  4. SELECT COUNT(2) FROM employees;

【问题讨论】:

  • 可能会有所不同,具体取决于所讨论的 SQL 的风格。但一般我看不出有什么不同。 MySQL 和 PL/SQL 没有已知的区别,当然,就我使用它们而言。
  • 另见SO 2710621

标签: sql count


【解决方案1】:

四个示例的计算结果都相同 - 没有区别。

可能给出不同答案的是:

SELECT COUNT(middle_initial) FROM employees;

如果middle_initial 列中有任何条目为NULL,则返回的计数将与COUNT(*) 不同,因为它只是该列中非空值的数量。

【讨论】:

  • 我不确定count(*) 是否会跳过那些 every 列为 NULL 的行,但无论如何这将是一个非常无用的行 :-)
  • 实际上,至少在 DB2 下(而且它非常符合标准),count(*) 确实包含每列都为 NULL 的行,所以我想这不是问题。
  • @paxdiablo: 是的 - COUNT(*) 只计算行数,而不管是否为空。
  • in sybase count(*) -> 计算所有内容,count(column_name) -> 计算非空值的列。
  • @Burçin Yazıcı:其他风格的 SQL 也是如此。
【解决方案2】:

在结果方面没有区别,它们都返回employees中的行数。

COUNT(expression) 仅表示“对于此表中的每一行,如果 expression 的计算结果为非空值,则计算这一行”。

但是,* 表示计数 anything,而 n 是一个常量数值,因此永远不会为空。因此,两者都不考虑实际的行数据,从而返回表中的总行数。

【讨论】:

    【解决方案3】:

    SELECT COUNT(x) FROM employees 将为您提供x 不是null 的行数。

    【讨论】:

      【解决方案4】:

      计数(*):

      指定应计算所有行以返回表中的总行数。 COUNT(*) 不带参数,不能与 DISTINCT 一起使用。 COUNT(*) 不需要表达式参数,因为根据定义,它不使用有关任何特定列的信息。 COUNT(*) 返回指定表中的行数,而不删除重复项。它分别计算每一行。这包括包含空值的行。

      因此,COUNT(*) 返回组中的项目数。这包括 NULL 值和重复项。

      总而言之。 Count(*) 将返回查询中与 where 子句匹配的所有行。

      如果你去

      从员工中选择 COUNT(*)

      返回的行数和你去的时候一样

      从员工中选择 *

      将从表中返回所有行。

      计数 1、2、3 和 4

      COUNT(*) 计算查询产生的行数,而 COUNT(1) 计算 1 值的数量。请注意,当您在查询中包含诸如数字或字符串之类的文字时,此文字将“附加”或附加到 FROM 子句生成的每一行。这也适用于聚合函数中的文字,例如 COUNT(1)。对于 Count(2) 、 Count(3) 和 Count(4) 也可以这样说。它将根据 Count(variable) 值的数量评估表达式并返回非空结果。

      如果你去

      从员工中选择 COUNT(1) 个

      它将返回与您去的相同的行数

      从员工中选择名字

      (其中 first_name 是表中的第 1 列)

      不过这里的好处是你可以去

      从员工中选择 COUNT(不同的 1)

      然后它将返回表中该列的唯一记录数。

      【讨论】:

      • 那为什么count(9999999)和count('xxxxxxxxxx')返回的值和coun(*)一样
      • 嗨对不起,我以为你指的是列名。它与“select count() ....”相同,在这种情况下,count(1) 是变相的 count(*),对于您输入的任何数字都相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2015-02-14
      相关资源
      最近更新 更多